diff --git a/format-clock-edge-cases/timeConverter.js b/format-clock-edge-cases/timeConverter.js index 310c07bd9..740d3c093 100644 --- a/format-clock-edge-cases/timeConverter.js +++ b/format-clock-edge-cases/timeConverter.js @@ -1,10 +1,24 @@ function formatAs12HourClock(time) { + if (typeof time !== "string") { + throw new TypeError("time must be a string in HH:mm format"); + } const hours = Number(time.slice(0, 2)); + const minutes = time.slice(3); + + if (hours === 0) { + return `12:${minutes} am`; + } if (hours > 12) { - return `${hours - 12}:00 pm`; + const pmHours = String(hours - 12).padStart(2, "0"); + return `${pmHours}:${minutes} pm`; } + + if (hours === 12) { + return `${time} pm`; + } + return `${time} am`; } diff --git a/format-clock-edge-cases/timeConverter.test.js b/format-clock-edge-cases/timeConverter.test.js index 88f2af094..28199301d 100644 --- a/format-clock-edge-cases/timeConverter.test.js +++ b/format-clock-edge-cases/timeConverter.test.js @@ -1,11 +1,43 @@ -import {formatAs12HourClock} from "./timeConverter.js"; -import assert from "node:assert"; +import { formatAs12HourClock } from "./timeConverter.js"; +import assert from "node:assert/strict"; import test from "node:test"; -test("correctly convert time after 12:00", function(){ - assert.equal(formatAs12HourClock("23:00"), "11:00 pm"); -}); +const cases = [ + ["00:00", "12:00 am"], + ["00:01", "12:01 am"], + ["01:05", "01:05 am"], + ["08:00", "08:00 am"], + ["11:59", "11:59 am"], + ["12:00", "12:00 pm"], + ["12:34", "12:34 pm"], + ["13:00", "01:00 pm"], + ["13:30", "01:30 pm"], + ["15:45", "03:45 pm"], + ["23:00", "11:00 pm"], + ["23:59", "11:59 pm"], +]; + +for (const [time, expected] of cases) { + test(`${time} converts to ${expected}`, () => { + assert.equal(formatAs12HourClock(time), expected); + }); +} + +for (const value of [true, false, [], ["08:00"], {}, 800, null, undefined]) { + test(`throws a TypeError for non-string input ${JSON.stringify(value)}`, () => { + assert.throws(() => formatAs12HourClock(value), TypeError); + }); +} + +test("converts every valid minute of the day", () => { + for (let hour = 0; hour < 24; hour += 1) { + for (let minute = 0; minute < 60; minute += 1) { + const time = `${String(hour).padStart(2, "0")}:${String(minute).padStart(2, "0")}`; + const convertedHour = hour % 12 || 12; + const period = hour < 12 ? "am" : "pm"; + const expected = `${String(convertedHour).padStart(2, "0")}:${String(minute).padStart(2, "0")} ${period}`; -test("can correctly convert morning time", function() { - assert.equal(formatAs12HourClock("08:00"), "08:00 am"); + assert.equal(formatAs12HourClock(time), expected, time); + } + } });