From c7c024185979a632bb17266f3d44e2cd50102a3c Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Thu, 23 May 2024 17:39:42 -0500 Subject: [PATCH 1/8] add new am/pm test cases for dateConfig util --- apps/client/src/common/utils/__tests__/dateConfig.test.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/client/src/common/utils/__tests__/dateConfig.test.js b/apps/client/src/common/utils/__tests__/dateConfig.test.js index 40b5f031d..00e0e0680 100644 --- a/apps/client/src/common/utils/__tests__/dateConfig.test.js +++ b/apps/client/src/common/utils/__tests__/dateConfig.test.js @@ -107,6 +107,10 @@ describe('test forgivingStringToMillis()', () => { { value: '9a', expect: 9 * MILLIS_PER_HOUR }, { value: '9pm', expect: (12 + 9) * MILLIS_PER_HOUR }, { value: '9p', expect: (12 + 9) * MILLIS_PER_HOUR }, + { value: '10am', expect: 10 * MILLIS_PER_HOUR }, + { value: '10a', expect: 10 * MILLIS_PER_HOUR }, + { value: '10pm', expect: (12 + 10) * MILLIS_PER_HOUR }, + { value: '10p', expect: (12 + 10) * MILLIS_PER_HOUR }, { value: '12am', expect: 0 }, { value: '12pm', expect: 12 * MILLIS_PER_HOUR }, ]; From e397500d078e373f18dffb0ef48ede5f38c024cb Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Thu, 23 May 2024 19:17:36 -0500 Subject: [PATCH 2/8] dynamically build am/pm tests --- .../common/utils/__tests__/dateConfig.test.js | 108 ++++++++++++++---- 1 file changed, 88 insertions(+), 20 deletions(-) diff --git a/apps/client/src/common/utils/__tests__/dateConfig.test.js b/apps/client/src/common/utils/__tests__/dateConfig.test.js index 00e0e0680..e43e2b684 100644 --- a/apps/client/src/common/utils/__tests__/dateConfig.test.js +++ b/apps/client/src/common/utils/__tests__/dateConfig.test.js @@ -94,26 +94,94 @@ describe('test forgivingStringToMillis()', () => { }); describe('handles am/pm', () => { - const ampm = [ - { value: '9:10:11am', expect: 9 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 11 * MILLIS_PER_SECOND }, - { value: '9:10:11a', expect: 9 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 11 * MILLIS_PER_SECOND }, - { value: '9:10:11pm', expect: (12 + 9) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 11 * MILLIS_PER_SECOND }, - { value: '9:10:11p', expect: (12 + 9) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 11 * MILLIS_PER_SECOND }, - { value: '9:10am', expect: 9 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, - { value: '9:10a', expect: 9 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, - { value: '9:10pm', expect: (12 + 9) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, - { value: '9:10p', expect: (12 + 9) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, - { value: '9am', expect: 9 * MILLIS_PER_HOUR }, - { value: '9a', expect: 9 * MILLIS_PER_HOUR }, - { value: '9pm', expect: (12 + 9) * MILLIS_PER_HOUR }, - { value: '9p', expect: (12 + 9) * MILLIS_PER_HOUR }, - { value: '10am', expect: 10 * MILLIS_PER_HOUR }, - { value: '10a', expect: 10 * MILLIS_PER_HOUR }, - { value: '10pm', expect: (12 + 10) * MILLIS_PER_HOUR }, - { value: '10p', expect: (12 + 10) * MILLIS_PER_HOUR }, - { value: '12am', expect: 0 }, - { value: '12pm', expect: 12 * MILLIS_PER_HOUR }, - ]; + + const ampm = []; + + // dynamically build up all string formats from 1 to 12:59:59 with a/am/p/pm tacked on space and no space + for (var hour = 1; hour <= 12; hour += 1) { + const adjustedHour = hour === 12 ? 0 : hour; + ampm.push({ value: `${hour}a`, expect: adjustedHour * MILLIS_PER_HOUR }); + ampm.push({ value: `${hour}am`, expect: adjustedHour * MILLIS_PER_HOUR }); + ampm.push({ value: `${hour}p`, expect: (12 + adjustedHour) * MILLIS_PER_HOUR }); + ampm.push({ value: `${hour}pm`, expect: (12 + adjustedHour) * MILLIS_PER_HOUR }); + + ampm.push({ value: `${hour} a`, expect: adjustedHour * MILLIS_PER_HOUR }); + ampm.push({ value: `${hour} am`, expect: adjustedHour * MILLIS_PER_HOUR }); + ampm.push({ value: `${hour} p`, expect: (12 + adjustedHour) * MILLIS_PER_HOUR }); + ampm.push({ value: `${hour} pm`, expect: (12 + adjustedHour) * MILLIS_PER_HOUR }); + + for (var minute = 0; minute <= 59; minute += 1) { + ampm.push({ + value: `${hour}:${String(minute).padStart(2, '0')}am`, + expect: adjustedHour * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE, + }); + ampm.push({ + value: `${hour}:${String(minute).padStart(2, '0')}a`, + expect: adjustedHour * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE, + }); + ampm.push({ + value: `${hour}:${String(minute).padStart(2, '0')}pm`, + expect: (12 + adjustedHour) * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE, + }); + ampm.push({ + value: `${hour}:${String(minute).padStart(2, '0')}p`, + expect: (12 + adjustedHour) * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE, + }); + + ampm.push({ + value: `${hour}:${String(minute).padStart(2, '0')} am`, + expect: adjustedHour * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE, + }); + ampm.push({ + value: `${hour}:${String(minute).padStart(2, '0')} a`, + expect: adjustedHour * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE, + }); + ampm.push({ + value: `${hour}:${String(minute).padStart(2, '0')} pm`, + expect: (12 + adjustedHour) * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE, + }); + ampm.push({ + value: `${hour}:${String(minute).padStart(2, '0')} p`, + expect: (12 + adjustedHour) * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE, + }); + + for (var second = 0; second <= 59; second += 1) { + ampm.push({ + value: `${hour}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')}am`, + expect: adjustedHour * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE + second * MILLIS_PER_SECOND, + }); + ampm.push({ + value: `${hour}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')}a`, + expect: adjustedHour * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE + second * MILLIS_PER_SECOND, + }); + ampm.push({ + value: `${hour}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')}pm`, + expect: (12 + adjustedHour) * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE + second * MILLIS_PER_SECOND, + }); + ampm.push({ + value: `${hour}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')}p`, + expect: (12 + adjustedHour) * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE + second * MILLIS_PER_SECOND, + }); + + ampm.push({ + value: `${hour}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')} am`, + expect: adjustedHour * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE + second * MILLIS_PER_SECOND, + }); + ampm.push({ + value: `${hour}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')} a`, + expect: adjustedHour * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE + second * MILLIS_PER_SECOND, + }); + ampm.push({ + value: `${hour}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')} pm`, + expect: (12 + adjustedHour) * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE + second * MILLIS_PER_SECOND, + }); + ampm.push({ + value: `${hour}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')} p`, + expect: (12 + adjustedHour) * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE + second * MILLIS_PER_SECOND, + }); + } + } + } for (const s of ampm) { it(`handles ${s.value}`, () => { From 3d13e784ea55ca1f853ad4d23b9171df8afa9ad2 Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Thu, 23 May 2024 19:45:12 -0500 Subject: [PATCH 3/8] fix parsing am/pm times --- apps/client/src/common/utils/dateConfig.ts | 46 +++++++++++++++------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/apps/client/src/common/utils/dateConfig.ts b/apps/client/src/common/utils/dateConfig.ts index 84a2d74d8..5108f73ca 100644 --- a/apps/client/src/common/utils/dateConfig.ts +++ b/apps/client/src/common/utils/dateConfig.ts @@ -45,7 +45,7 @@ function checkAmPm(value: string) { * @description Utility function to check if a string contain h / m / s indicators * @param {string} value */ -function checkMatchers(value: string) { +function checkMatchers(value: string): number | null { const hoursMatch = /(\d+)h/i.exec(value); const hoursMatchValue = hoursMatch ? parse(hoursMatch[1]) : 0; @@ -60,7 +60,7 @@ function checkMatchers(value: string) { hoursMatchValue * MILLIS_PER_HOUR + minutesMatchValue * MILLIS_PER_MINUTE + secondsMatchValue * MILLIS_PER_SECOND ); } - return { hoursMatchValue }; + return null; } /** @@ -85,8 +85,8 @@ function inferSeparators(value: string, isAM: boolean, isPM: boolean) { } } else if (length === 2) { if (isPM || isAM) { - inferredMillis = parse(value) * inferredMillis; - if (isAM) { + inferredMillis = parse(value) * MILLIS_PER_HOUR; + if (isAM || (isPM && value === '12')) { // this ensures we dont add 12 hours in the end addAM = 12; } @@ -112,43 +112,59 @@ function inferSeparators(value: string, isAM: boolean, isPM: boolean) { * @returns {number} - time string in millis */ export const forgivingStringToMillis = (value: string): number => { - if (value === '12am') { + if (value === '12am' || value === '12a') { return 0; } const { isAM, isPM, value: parsingValue } = checkAmPm(value); const maybeMillisFromMatchers = checkMatchers(parsingValue); - if (typeof maybeMillisFromMatchers === 'number') { + if (maybeMillisFromMatchers !== null) { return maybeMillisFromMatchers; } - let { hoursMatchValue } = maybeMillisFromMatchers; - - let millis = 0; - // split string at known separators : , . const separatorRegex = /[\s,:.]+/; const [first, second, third] = parsingValue.split(separatorRegex); + let addTwelve = isPM; + + let millis = 0; + if (first != null && second != null && third != null) { // if string has three sections, treat as [hours] [minutes] [seconds] - millis = parse(first) * MILLIS_PER_HOUR; + let hours = parse(first); + if (hours === 12) { + if (isAM) { + hours = 0; + } + addTwelve = false; + } + + millis = hours * MILLIS_PER_HOUR; millis += parse(second) * MILLIS_PER_MINUTE; millis += parse(third) * MILLIS_PER_SECOND; } else if (first != null && second == null && third == null) { // we only have one section, infer separators const { inferredMillis, addAM } = inferSeparators(first, isAM, isPM); millis = inferredMillis; - hoursMatchValue = addAM; + addTwelve = addAM < 12 && isPM; } if (first != null && second != null && third == null) { // if string has two sections, treat as [hours] [minutes] - millis = parse(first) * MILLIS_PER_HOUR; + let hours = parse(first); + if (hours === 12) { + if (isAM) { + hours = 0; + } + addTwelve = false; + } + + millis = hours * MILLIS_PER_HOUR; millis += parse(second) * MILLIS_PER_MINUTE; } - // Add 12 hours if it is PM - if (isPM && hoursMatchValue < 12) { + // Add 12 hours if needed + if (addTwelve) { millis += 12 * MILLIS_PER_HOUR; } From 98418014d39a25e752b9bba975753551420dee83 Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Thu, 23 May 2024 20:16:41 -0500 Subject: [PATCH 4/8] lowercase time string before beginning to parse --- apps/client/src/common/utils/dateConfig.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/client/src/common/utils/dateConfig.ts b/apps/client/src/common/utils/dateConfig.ts index 5108f73ca..e0f091544 100644 --- a/apps/client/src/common/utils/dateConfig.ts +++ b/apps/client/src/common/utils/dateConfig.ts @@ -112,6 +112,8 @@ function inferSeparators(value: string, isAM: boolean, isPM: boolean) { * @returns {number} - time string in millis */ export const forgivingStringToMillis = (value: string): number => { + value = value.toLowerCase(); + if (value === '12am' || value === '12a') { return 0; } From 834aafe06d4675c32a56181561aa1c2b27299d8c Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Thu, 23 May 2024 20:29:05 -0500 Subject: [PATCH 5/8] remove need for hardcoded 12am test --- apps/client/src/common/utils/dateConfig.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/apps/client/src/common/utils/dateConfig.ts b/apps/client/src/common/utils/dateConfig.ts index e0f091544..3e027e2da 100644 --- a/apps/client/src/common/utils/dateConfig.ts +++ b/apps/client/src/common/utils/dateConfig.ts @@ -85,8 +85,13 @@ function inferSeparators(value: string, isAM: boolean, isPM: boolean) { } } else if (length === 2) { if (isPM || isAM) { - inferredMillis = parse(value) * MILLIS_PER_HOUR; - if (isAM || (isPM && value === '12')) { + if (value === '12' && isAM) { + inferredMillis = 0; + } else { + inferredMillis = parse(value) * MILLIS_PER_HOUR; + } + + if (isAM || value === '12') { // this ensures we dont add 12 hours in the end addAM = 12; } @@ -114,10 +119,6 @@ function inferSeparators(value: string, isAM: boolean, isPM: boolean) { export const forgivingStringToMillis = (value: string): number => { value = value.toLowerCase(); - if (value === '12am' || value === '12a') { - return 0; - } - const { isAM, isPM, value: parsingValue } = checkAmPm(value); const maybeMillisFromMatchers = checkMatchers(parsingValue); if (maybeMillisFromMatchers !== null) { From 1907abc512ff03a4fa05eb9a70a9085de811418f Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Fri, 24 May 2024 05:53:07 -0500 Subject: [PATCH 6/8] pare back am/pm tests --- .../common/utils/__tests__/dateConfig.test.js | 123 +++++++----------- 1 file changed, 45 insertions(+), 78 deletions(-) diff --git a/apps/client/src/common/utils/__tests__/dateConfig.test.js b/apps/client/src/common/utils/__tests__/dateConfig.test.js index e43e2b684..a11e41f69 100644 --- a/apps/client/src/common/utils/__tests__/dateConfig.test.js +++ b/apps/client/src/common/utils/__tests__/dateConfig.test.js @@ -94,93 +94,60 @@ describe('test forgivingStringToMillis()', () => { }); describe('handles am/pm', () => { - const ampm = []; - // dynamically build up all string formats from 1 to 12:59:59 with a/am/p/pm tacked on space and no space + const minutesAndSecondsToTest = [0, 9, 10, 59]; + + const suffixes = [ + { value: 'a', hourShift: 0 }, + { value: 'am', hourShift: 0 }, + { value: 'p', hourShift: 12 }, + { value: 'pm', hourShift: 12 }, + + { value: ' a', hourShift: 0 }, + { value: ' am', hourShift: 0 }, + { value: ' p', hourShift: 12 }, + { value: ' pm', hourShift: 12 }, + + { value: 'A', hourShift: 0 }, + { value: 'AM', hourShift: 0 }, + { value: 'P', hourShift: 12 }, + { value: 'PM', hourShift: 12 }, + + { value: ' A', hourShift: 0 }, + { value: ' AM', hourShift: 0 }, + { value: ' P', hourShift: 12 }, + { value: ' PM', hourShift: 12 }, + ]; + + // dynamically build up string formats for all hours and some minute/second values with a/am/p/pm tacked on space and no space and upper/lower case for (var hour = 1; hour <= 12; hour += 1) { const adjustedHour = hour === 12 ? 0 : hour; - ampm.push({ value: `${hour}a`, expect: adjustedHour * MILLIS_PER_HOUR }); - ampm.push({ value: `${hour}am`, expect: adjustedHour * MILLIS_PER_HOUR }); - ampm.push({ value: `${hour}p`, expect: (12 + adjustedHour) * MILLIS_PER_HOUR }); - ampm.push({ value: `${hour}pm`, expect: (12 + adjustedHour) * MILLIS_PER_HOUR }); - ampm.push({ value: `${hour} a`, expect: adjustedHour * MILLIS_PER_HOUR }); - ampm.push({ value: `${hour} am`, expect: adjustedHour * MILLIS_PER_HOUR }); - ampm.push({ value: `${hour} p`, expect: (12 + adjustedHour) * MILLIS_PER_HOUR }); - ampm.push({ value: `${hour} pm`, expect: (12 + adjustedHour) * MILLIS_PER_HOUR }); + suffixes.forEach((suffix) => { + ampm.push({ value: `${hour}${suffix.value}`, expect: (adjustedHour + suffix.hourShift) * MILLIS_PER_HOUR }); + }); - for (var minute = 0; minute <= 59; minute += 1) { - ampm.push({ - value: `${hour}:${String(minute).padStart(2, '0')}am`, - expect: adjustedHour * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE, - }); - ampm.push({ - value: `${hour}:${String(minute).padStart(2, '0')}a`, - expect: adjustedHour * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE, - }); - ampm.push({ - value: `${hour}:${String(minute).padStart(2, '0')}pm`, - expect: (12 + adjustedHour) * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE, - }); - ampm.push({ - value: `${hour}:${String(minute).padStart(2, '0')}p`, - expect: (12 + adjustedHour) * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE, + minutesAndSecondsToTest.forEach((minute) => { + suffixes.forEach((suffix) => { + ampm.push({ + value: `${hour}:${String(minute).padStart(2, '0')}${suffix.value}`, + expect: (adjustedHour + suffix.hourShift) * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE, + }); }); - ampm.push({ - value: `${hour}:${String(minute).padStart(2, '0')} am`, - expect: adjustedHour * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE, + minutesAndSecondsToTest.forEach((second) => { + suffixes.forEach((suffix) => { + ampm.push({ + value: `${hour}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')}${suffix.value}`, + expect: + (adjustedHour + suffix.hourShift) * MILLIS_PER_HOUR + + minute * MILLIS_PER_MINUTE + + second * MILLIS_PER_SECOND, + }); + }); }); - ampm.push({ - value: `${hour}:${String(minute).padStart(2, '0')} a`, - expect: adjustedHour * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE, - }); - ampm.push({ - value: `${hour}:${String(minute).padStart(2, '0')} pm`, - expect: (12 + adjustedHour) * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE, - }); - ampm.push({ - value: `${hour}:${String(minute).padStart(2, '0')} p`, - expect: (12 + adjustedHour) * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE, - }); - - for (var second = 0; second <= 59; second += 1) { - ampm.push({ - value: `${hour}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')}am`, - expect: adjustedHour * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE + second * MILLIS_PER_SECOND, - }); - ampm.push({ - value: `${hour}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')}a`, - expect: adjustedHour * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE + second * MILLIS_PER_SECOND, - }); - ampm.push({ - value: `${hour}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')}pm`, - expect: (12 + adjustedHour) * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE + second * MILLIS_PER_SECOND, - }); - ampm.push({ - value: `${hour}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')}p`, - expect: (12 + adjustedHour) * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE + second * MILLIS_PER_SECOND, - }); - - ampm.push({ - value: `${hour}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')} am`, - expect: adjustedHour * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE + second * MILLIS_PER_SECOND, - }); - ampm.push({ - value: `${hour}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')} a`, - expect: adjustedHour * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE + second * MILLIS_PER_SECOND, - }); - ampm.push({ - value: `${hour}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')} pm`, - expect: (12 + adjustedHour) * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE + second * MILLIS_PER_SECOND, - }); - ampm.push({ - value: `${hour}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')} p`, - expect: (12 + adjustedHour) * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE + second * MILLIS_PER_SECOND, - }); - } - } + }); } for (const s of ampm) { From afe0323384be8833188df115511fed2b3ee24799 Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Fri, 24 May 2024 06:12:46 -0500 Subject: [PATCH 7/8] use let not var --- apps/client/src/common/utils/__tests__/dateConfig.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/common/utils/__tests__/dateConfig.test.js b/apps/client/src/common/utils/__tests__/dateConfig.test.js index a11e41f69..d45e49985 100644 --- a/apps/client/src/common/utils/__tests__/dateConfig.test.js +++ b/apps/client/src/common/utils/__tests__/dateConfig.test.js @@ -121,7 +121,7 @@ describe('test forgivingStringToMillis()', () => { ]; // dynamically build up string formats for all hours and some minute/second values with a/am/p/pm tacked on space and no space and upper/lower case - for (var hour = 1; hour <= 12; hour += 1) { + for (let hour = 1; hour <= 12; hour += 1) { const adjustedHour = hour === 12 ? 0 : hour; suffixes.forEach((suffix) => { From 9cbd4c085b5935ae47f968994a44f8bbca6c79a5 Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Fri, 24 May 2024 06:51:51 -0500 Subject: [PATCH 8/8] slim back tests even further and list out --- .../common/utils/__tests__/dateConfig.test.js | 104 +++++++++--------- 1 file changed, 55 insertions(+), 49 deletions(-) diff --git a/apps/client/src/common/utils/__tests__/dateConfig.test.js b/apps/client/src/common/utils/__tests__/dateConfig.test.js index d45e49985..2fe45e67b 100644 --- a/apps/client/src/common/utils/__tests__/dateConfig.test.js +++ b/apps/client/src/common/utils/__tests__/dateConfig.test.js @@ -94,62 +94,68 @@ describe('test forgivingStringToMillis()', () => { }); describe('handles am/pm', () => { - const ampm = []; + const ampm = [ + { value: '1am', expect: 1 * MILLIS_PER_HOUR }, + { value: '1pm', expect: (12 + 1) * MILLIS_PER_HOUR }, + { value: '1 am', expect: 1 * MILLIS_PER_HOUR }, + { value: '1 pm', expect: (12 + 1) * MILLIS_PER_HOUR }, + { value: '1AM', expect: 1 * MILLIS_PER_HOUR }, + { value: '1PM', expect: (12 + 1) * MILLIS_PER_HOUR }, - const minutesAndSecondsToTest = [0, 9, 10, 59]; + { value: '9am', expect: 9 * MILLIS_PER_HOUR }, + { value: '9pm', expect: (12 + 9) * MILLIS_PER_HOUR }, - const suffixes = [ - { value: 'a', hourShift: 0 }, - { value: 'am', hourShift: 0 }, - { value: 'p', hourShift: 12 }, - { value: 'pm', hourShift: 12 }, + { value: '10am', expect: 10 * MILLIS_PER_HOUR }, + { value: '10pm', expect: (12 + 10) * MILLIS_PER_HOUR }, + { value: '10 am', expect: 10 * MILLIS_PER_HOUR }, + { value: '10 pm', expect: (12 + 10) * MILLIS_PER_HOUR }, + { value: '10AM', expect: 10 * MILLIS_PER_HOUR }, + { value: '10PM', expect: (12 + 10) * MILLIS_PER_HOUR }, - { value: ' a', hourShift: 0 }, - { value: ' am', hourShift: 0 }, - { value: ' p', hourShift: 12 }, - { value: ' pm', hourShift: 12 }, + { value: '12am', expect: 0 * MILLIS_PER_HOUR }, + { value: '12pm', expect: 12 * MILLIS_PER_HOUR }, - { value: 'A', hourShift: 0 }, - { value: 'AM', hourShift: 0 }, - { value: 'P', hourShift: 12 }, - { value: 'PM', hourShift: 12 }, + { value: '1:10am', expect: 1 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '1:10pm', expect: (12 + 1) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '1:10 am', expect: 1 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '1:10 pm', expect: (12 + 1) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '1:10AM', expect: 1 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '1:10PM', expect: (12 + 1) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, - { value: ' A', hourShift: 0 }, - { value: ' AM', hourShift: 0 }, - { value: ' P', hourShift: 12 }, - { value: ' PM', hourShift: 12 }, + { value: '9:10am', expect: 9 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '9:10pm', expect: (12 + 9) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + + { value: '10:10am', expect: 10 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '10:10pm', expect: (12 + 10) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '10:10 am', expect: 10 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '10:10 pm', expect: (12 + 10) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '10:10AM', expect: 10 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '10:10PM', expect: (12 + 10) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + + { value: '12:10am', expect: 0 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + { value: '12:10pm', expect: 12 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE }, + + { value: '1:10:10am', expect: 1 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '1:10:10pm', expect: (12 + 1) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '1:10:10 am', expect: 1 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '1:10:10 pm', expect: (12 + 1) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '1:10:10AM', expect: 1 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '1:10:10PM', expect: (12 + 1) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + + { value: '9:10:10am', expect: 9 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '9:10:10pm', expect: (12 + 9) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + + { value: '10:10:10am', expect: 10 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '10:10:10pm', expect: (12 + 10) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '10:10:10 am', expect: 10 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '10:10:10 pm', expect: (12 + 10) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '10:10:10AM', expect: 10 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '10:10:10PM', expect: (12 + 10) * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + + { value: '12:10:10am', expect: 0 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, + { value: '12:10:10pm', expect: 12 * MILLIS_PER_HOUR + 10 * MILLIS_PER_MINUTE + 10 * MILLIS_PER_SECOND }, ]; - // dynamically build up string formats for all hours and some minute/second values with a/am/p/pm tacked on space and no space and upper/lower case - for (let hour = 1; hour <= 12; hour += 1) { - const adjustedHour = hour === 12 ? 0 : hour; - - suffixes.forEach((suffix) => { - ampm.push({ value: `${hour}${suffix.value}`, expect: (adjustedHour + suffix.hourShift) * MILLIS_PER_HOUR }); - }); - - minutesAndSecondsToTest.forEach((minute) => { - suffixes.forEach((suffix) => { - ampm.push({ - value: `${hour}:${String(minute).padStart(2, '0')}${suffix.value}`, - expect: (adjustedHour + suffix.hourShift) * MILLIS_PER_HOUR + minute * MILLIS_PER_MINUTE, - }); - }); - - minutesAndSecondsToTest.forEach((second) => { - suffixes.forEach((suffix) => { - ampm.push({ - value: `${hour}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')}${suffix.value}`, - expect: - (adjustedHour + suffix.hourShift) * MILLIS_PER_HOUR + - minute * MILLIS_PER_MINUTE + - second * MILLIS_PER_SECOND, - }); - }); - }); - }); - } - for (const s of ampm) { it(`handles ${s.value}`, () => { expect(forgivingStringToMillis(s.value)).toBe(s.expect);