Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion format-clock-edge-cases/timeConverter.js

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This works... but what if the value of time passed is not what you expect? e.g a Boolean or an array. A base case should guard that.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the review. The guard issue has been fixed.

Original file line number Diff line number Diff line change
@@ -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`;
}

Expand Down
46 changes: 39 additions & 7 deletions format-clock-edge-cases/timeConverter.test.js
Original file line number Diff line number Diff line change
@@ -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);
}
}
});
Loading