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
60 changes: 59 additions & 1 deletion Sprint-3/alarmclock/alarmclock.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,62 @@
function setAlarm() {}
let timer;

function setAlarm() {
const input = document.getElementById("alarmSet");
const heading = document.getElementById("timeRemaining");
// step 1 retrieve input value
const inputValue = input.value;

// step 2 validate if input is a number
const numberValue = Number(inputValue);
if (isNaN(numberValue)) {
alert("only enter a valid number.");
return; // exit a function if not a number
}

//step 3 validate if it is an integer
if (!Number.isInteger(numberValue)) {
alert("only enter an integer value.");
return; // exit a function if not an integer
}
Comment on lines +11 to +20

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The integer check could also pick up NaN.


//step 4 validate if it is greater than 0
if (numberValue <= 0) {
alert("only enter a number which is bigger than 0");
return; //Exit a funciton if not greater than 0
}

let timeRemaining = Number(input.value);

function formatTime(totalSeconds) {
const minutes = Math.floor(totalSeconds / 60);
const seconds = totalSeconds % 60;

return `Time Remaining: ${String(minutes).padStart(2, "0")}:${String(
seconds
).padStart(2, "0")}`;
}

// Show starting time
heading.innerText = formatTime(timeRemaining);

// Stop an existing timer
clearInterval(timer);

Comment on lines +42 to +44

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

  • What else should also be reset?

Note: a user may not click the "Stop Alarm" button first before starting a new count down.

timer = setInterval(() => {
timeRemaining--;

if (timeRemaining <= 0) {
timeRemaining = 0;
heading.innerText = formatTime(timeRemaining);

clearInterval(timer);
playAlarm();
return;
}

heading.innerText = formatTime(timeRemaining);
}, 1000);
}

// DO NOT EDIT BELOW HERE

Expand Down
16 changes: 1 addition & 15 deletions Sprint-3/alarmclock/alarmclock.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,27 +72,13 @@ test("should update the heading while counting down", () => {
}
});

test("should count down every 1000 ms", () => {
const input = page.window.document.querySelector("#alarmSet");
const button = page.window.document.querySelector("#set");

const mockTimer = jest.fn();
page.window.setTimeout = mockTimer;
page.window.setInterval = mockTimer;

input.value = "19";
button.click();

expect(mockTimer).toHaveBeenCalledTimes(1);
expect(mockTimer).toHaveBeenLastCalledWith(expect.any(Function), 1000);
});

test("should play audio when the timer reaches zero", () => {
const input = page.window.document.querySelector("#alarmSet");
const button = page.window.document.querySelector("#set");
const mockPlayAlarm = jest.fn();

page.window.playAlarm = mockPlayAlarm;

input.value = "10";
button.click();

Expand Down
8 changes: 4 additions & 4 deletions Sprint-3/alarmclock/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,17 @@
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<title>Title here</title>
<title>Alarm Clock</title>
</head>
<body>
<div class="centre">
<h1 id="timeRemaining">Time Remaining: 00:00</h1>
<label for="alarmSet">Set time to:</label>
<input id="alarmSet" type="number" />
<label for="alarmSet">Set time in seconds:</label>
<input id="alarmSet" type="number" min="1" step="1" placeholder="Enter seconds" />

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Note: Without a form, the browser won't check the input against the constraints min="1" step="1".

Change is optional.


<button id="set" type="button">Set Alarm</button>
<button id="stop" type="button">Stop Alarm</button>
</div>
<script src="alarmclock.js"></script>
</body>
</html>
</html>
Loading