From 8a715f457b7a426d0beeb9072e238015bc508fcc Mon Sep 17 00:00:00 2001 From: Brian Yorachi Date: Wed, 14 Oct 2026 13:21:51 +0100 Subject: [PATCH 1/6] Implement sprint 3 functions --- .../implement/1-get-angle-type.js | 22 ++++++++++++++++++- .../implement/2-is-proper-fraction.js | 2 +- .../implement/3-get-card-value.js | 20 ++++++++++++++++- 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/implement-and-rewrite-tests/implement/1-get-angle-type.js b/implement-and-rewrite-tests/implement/1-get-angle-type.js index 8a6fba050..a2e2cb7d2 100644 --- a/implement-and-rewrite-tests/implement/1-get-angle-type.js +++ b/implement-and-rewrite-tests/implement/1-get-angle-type.js @@ -17,5 +17,25 @@ // execute the code to ensure all tests pass. export function getAngleType(angle) { - // TODO: Implement this function + if (angle <= 0 || angle >= 360) { + return "Invalid angle"; + } + + if (angle < 90) { + return "Acute angle"; + } + + if (angle === 90) { + return "Right angle"; + } + + if (angle < 180) { + return "Obtuse angle"; + } + + if (angle === 180) { + return "Straight angle"; + } + + return "Reflex angle"; } diff --git a/implement-and-rewrite-tests/implement/2-is-proper-fraction.js b/implement-and-rewrite-tests/implement/2-is-proper-fraction.js index f983800f0..55ac4ceae 100644 --- a/implement-and-rewrite-tests/implement/2-is-proper-fraction.js +++ b/implement-and-rewrite-tests/implement/2-is-proper-fraction.js @@ -14,5 +14,5 @@ // execute the code to ensure all tests pass. export function isProperFraction(numerator, denominator) { - // TODO: Implement this function + return denominator !== 0 && Math.abs(numerator) < Math.abs(denominator); } diff --git a/implement-and-rewrite-tests/implement/3-get-card-value.js b/implement-and-rewrite-tests/implement/3-get-card-value.js index 9614ab1ee..145638874 100644 --- a/implement-and-rewrite-tests/implement/3-get-card-value.js +++ b/implement-and-rewrite-tests/implement/3-get-card-value.js @@ -24,5 +24,23 @@ // execute the code to ensure all tests pass. export function getCardValue(card) { - // TODO: Implement this function + const cardPattern = /^(A|[2-9]|10|J|Q|K)[♠♥♦♣]$/; + + if (typeof card !== "string" || !cardPattern.test(card)) { + throw new Error( + `Expected a number followed by a suit, but got "${card}"`, + ); + } + + const rank = card.slice(0, -1); + + if (rank === "A") { + return 11; + } + + if (["J", "Q", "K"].includes(rank)) { + return 10; + } + + return Number(rank); } From cbcc2b3210d59f3eb41073a76fd2f382c858bb86 Mon Sep 17 00:00:00 2001 From: Brian Yorachi Date: Wed, 14 Oct 2026 13:23:01 +0100 Subject: [PATCH 2/6] Complete node and Jest sprint tests --- .../1-get-angle-type.test.js | 33 ++++++++++++++++--- .../2-is-proper-fraction.test.js | 25 +++++++++++--- .../3-get-card-value.test.js | 22 +++++++++---- .../1-get-angle-type.test.js | 33 ++++++++++--------- .../2-is-proper-fraction.test.js | 19 ++++++++--- .../3-get-card-value.test.js | 30 +++++++++-------- 6 files changed, 113 insertions(+), 49 deletions(-) diff --git a/implement-and-rewrite-tests/implement-tests-with-node-test/1-get-angle-type.test.js b/implement-and-rewrite-tests/implement-tests-with-node-test/1-get-angle-type.test.js index cf50f6cad..b3d37fcb6 100644 --- a/implement-and-rewrite-tests/implement-tests-with-node-test/1-get-angle-type.test.js +++ b/implement-and-rewrite-tests/implement-tests-with-node-test/1-get-angle-type.test.js @@ -3,10 +3,35 @@ import test from "node:test"; import { getAngleType } from "../implement/1-get-angle-type.js"; -// TODO: Write tests to cover all cases, including boundary and invalid cases. -// Example: Identify Right Angles +test("Classifies acute angles", () => { + assert.equal(getAngleType(1), "Acute angle"); + assert.equal(getAngleType(45), "Acute angle"); + assert.equal(getAngleType(89), "Acute angle"); +}); test("Classifies right angles", () => { - const right = getAngleType(90); - assert.equal(right, "Right angle"); + assert.equal(getAngleType(90), "Right angle"); +}); + +test("Classifies obtuse angles", () => { + assert.equal(getAngleType(91), "Obtuse angle"); + assert.equal(getAngleType(135), "Obtuse angle"); + assert.equal(getAngleType(179), "Obtuse angle"); +}); + +test("Classifies straight angles", () => { + assert.equal(getAngleType(180), "Straight angle"); +}); + +test("Classifies reflex angles", () => { + assert.equal(getAngleType(181), "Reflex angle"); + assert.equal(getAngleType(270), "Reflex angle"); + assert.equal(getAngleType(359), "Reflex angle"); +}); + +test("Rejects angles outside the valid range", () => { + assert.equal(getAngleType(0), "Invalid angle"); + assert.equal(getAngleType(360), "Invalid angle"); + assert.equal(getAngleType(-1), "Invalid angle"); + assert.equal(getAngleType(361), "Invalid angle"); }); diff --git a/implement-and-rewrite-tests/implement-tests-with-node-test/2-is-proper-fraction.test.js b/implement-and-rewrite-tests/implement-tests-with-node-test/2-is-proper-fraction.test.js index a29084605..d1dfa35e4 100644 --- a/implement-and-rewrite-tests/implement-tests-with-node-test/2-is-proper-fraction.test.js +++ b/implement-and-rewrite-tests/implement-tests-with-node-test/2-is-proper-fraction.test.js @@ -3,10 +3,25 @@ import test from "node:test"; import { isProperFraction } from "../implement/2-is-proper-fraction.js"; -// TODO: Write tests to cover all cases. -// What combinations of numerators and denominators should you test? - -test("Basic proper fraction", () => { - // Example: 1/2 is a proper fraction +test("Recognises positive proper fractions", () => { assert.equal(isProperFraction(1, 2), true); + assert.equal(isProperFraction(9, 10), true); +}); + +test("Rejects improper and whole fractions", () => { + assert.equal(isProperFraction(2, 1), false); + assert.equal(isProperFraction(3, 3), false); + assert.equal(isProperFraction(10, 2), false); +}); + +test("Handles zero and negative values", () => { + assert.equal(isProperFraction(0, 5), true); + assert.equal(isProperFraction(-1, 2), true); + assert.equal(isProperFraction(1, -2), true); + assert.equal(isProperFraction(-3, -2), false); +}); + +test("Rejects a zero denominator", () => { + assert.equal(isProperFraction(0, 0), false); + assert.equal(isProperFraction(1, 0), false); }); diff --git a/implement-and-rewrite-tests/implement-tests-with-node-test/3-get-card-value.test.js b/implement-and-rewrite-tests/implement-tests-with-node-test/3-get-card-value.test.js index f5092d9b1..09dc0d8a8 100644 --- a/implement-and-rewrite-tests/implement-tests-with-node-test/3-get-card-value.test.js +++ b/implement-and-rewrite-tests/implement-tests-with-node-test/3-get-card-value.test.js @@ -3,14 +3,24 @@ import test from "node:test"; import { getCardValue } from "../implement/3-get-card-value.js"; -// TODO: Write tests to cover all outcomes, including throwing errors for invalid cards. - -test("Valid single-digit card", () => { +test("Returns the value of number cards", () => { + assert.equal(getCardValue("2♠"), 2); assert.equal(getCardValue("9♠"), 9); + assert.equal(getCardValue("10♥"), 10); }); -test("Arbitrary non-card string", () => { - assert.throws(() => getCardValue("invalid"), /Expected a number followed by a suit, but got "invalid"/, "Expected clear error"); +test("Returns the value of aces and face cards", () => { + assert.equal(getCardValue("A♠"), 11); + assert.equal(getCardValue("J♣"), 10); + assert.equal(getCardValue("Q♦"), 10); + assert.equal(getCardValue("K♥"), 10); }); -// TODO: What other invalid card cases can you think of? +test("Rejects invalid card strings", () => { + assert.throws(() => getCardValue("invalid"), /Expected a number followed by a suit, but got "invalid"/, "Expected clear error"); + assert.throws(() => getCardValue("1♠")); + assert.throws(() => getCardValue("11♠")); + assert.throws(() => getCardValue("A")); + assert.throws(() => getCardValue("A X")); + assert.throws(() => getCardValue("A🃏")); +}); diff --git a/implement-and-rewrite-tests/rewrite-tests-with-jest/1-get-angle-type.test.js b/implement-and-rewrite-tests/rewrite-tests-with-jest/1-get-angle-type.test.js index e0ba786ab..0fa410fb8 100644 --- a/implement-and-rewrite-tests/rewrite-tests-with-jest/1-get-angle-type.test.js +++ b/implement-and-rewrite-tests/rewrite-tests-with-jest/1-get-angle-type.test.js @@ -1,18 +1,21 @@ import { getAngleType } from "../implement/1-get-angle-type.js"; -// TODO: Write tests in Jest syntax to cover all cases/outcomes, -// including boundary and invalid cases. - -// Case 1: Acute angles -test(`should return "Acute angle" when (0 < angle < 90)`, () => { - // Test various acute angles, including boundary cases - expect(getAngleType(1)).toEqual("Acute angle"); - expect(getAngleType(45)).toEqual("Acute angle"); - expect(getAngleType(89)).toEqual("Acute angle"); +test.each([ + [1, "Acute angle"], + [45, "Acute angle"], + [89, "Acute angle"], + [90, "Right angle"], + [91, "Obtuse angle"], + [135, "Obtuse angle"], + [179, "Obtuse angle"], + [180, "Straight angle"], + [181, "Reflex angle"], + [270, "Reflex angle"], + [359, "Reflex angle"], + [0, "Invalid angle"], + [360, "Invalid angle"], + [-1, "Invalid angle"], + [361, "Invalid angle"], +])("classifies an angle of %i degrees", (angle, expectedType) => { + expect(getAngleType(angle)).toEqual(expectedType); }); - -// Case 2: Right angle -// Case 3: Obtuse angles -// Case 4: Straight angle -// Case 5: Reflex angles -// Case 6: Invalid angles diff --git a/implement-and-rewrite-tests/rewrite-tests-with-jest/2-is-proper-fraction.test.js b/implement-and-rewrite-tests/rewrite-tests-with-jest/2-is-proper-fraction.test.js index 5d49e2d8b..644f10bc6 100644 --- a/implement-and-rewrite-tests/rewrite-tests-with-jest/2-is-proper-fraction.test.js +++ b/implement-and-rewrite-tests/rewrite-tests-with-jest/2-is-proper-fraction.test.js @@ -1,8 +1,17 @@ import { isProperFraction } from "../implement/2-is-proper-fraction.js"; -// TODO: Write tests in Jest syntax to cover all combinations of positives, negatives, zeros, and other categories. - -// Special case: numerator is zero -test(`should return false when denominator is zero`, () => { - expect(isProperFraction(1, 0)).toEqual(false); +test.each([ + [1, 2, true], + [9, 10, true], + [2, 1, false], + [3, 3, false], + [10, 2, false], + [0, 5, true], + [-1, 2, true], + [1, -2, true], + [-3, -2, false], + [0, 0, false], + [1, 0, false], +])("checks %i/%i", (numerator, denominator, expected) => { + expect(isProperFraction(numerator, denominator)).toEqual(expected); }); diff --git a/implement-and-rewrite-tests/rewrite-tests-with-jest/3-get-card-value.test.js b/implement-and-rewrite-tests/rewrite-tests-with-jest/3-get-card-value.test.js index a6de5a82a..b4fd3a4f5 100644 --- a/implement-and-rewrite-tests/rewrite-tests-with-jest/3-get-card-value.test.js +++ b/implement-and-rewrite-tests/rewrite-tests-with-jest/3-get-card-value.test.js @@ -1,18 +1,20 @@ import { getCardValue } from "../implement/3-get-card-value.js"; -// TODO: Write tests in Jest syntax to cover all possible outcomes. - -// Case 1: Ace (A) -test(`Should return 11 when given an ace card`, () => { - expect(getCardValue("A♠")).toEqual(11); +test.each([ + ["2♠", 2], + ["9♠", 9], + ["10♥", 10], + ["A♠", 11], + ["J♣", 10], + ["Q♦", 10], + ["K♥", 10], +])("returns the value of %s", (card, expectedValue) => { + expect(getCardValue(card)).toEqual(expectedValue); }); -// Suggestion: Group the remaining test data into these categories: -// Number Cards (2-10) -// Face Cards (J, Q, K) -// Invalid Cards - -// To learn how to test whether a function throws an error as expected in Jest, -// please refer to the Jest documentation: -// https://jestjs.io/docs/expect#tothrowerror - +test.each(["invalid", "1♠", "11♠", "A", "A X", "A🃏"])( + "rejects invalid card %s", + (card) => { + expect(() => getCardValue(card)).toThrow(); + }, +); From 22d4a37a6e9e9316a4c1a94aaefd50b5db74f358 Mon Sep 17 00:00:00 2001 From: Brian Yorachi Date: Wed, 14 Oct 2026 13:52:56 +0100 Subject: [PATCH 3/6] Add decimal angle boundary tests --- .../1-get-angle-type.test.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/implement-and-rewrite-tests/implement-tests-with-node-test/1-get-angle-type.test.js b/implement-and-rewrite-tests/implement-tests-with-node-test/1-get-angle-type.test.js index b3d37fcb6..a6adefb9b 100644 --- a/implement-and-rewrite-tests/implement-tests-with-node-test/1-get-angle-type.test.js +++ b/implement-and-rewrite-tests/implement-tests-with-node-test/1-get-angle-type.test.js @@ -35,3 +35,12 @@ test("Rejects angles outside the valid range", () => { assert.equal(getAngleType(-1), "Invalid angle"); assert.equal(getAngleType(361), "Invalid angle"); }); + +test("Classifies angles immediately around category boundaries", () => { + assert.equal(getAngleType(0.1), "Acute angle"); + assert.equal(getAngleType(89.9), "Acute angle"); + assert.equal(getAngleType(90.1), "Obtuse angle"); + assert.equal(getAngleType(179.9), "Obtuse angle"); + assert.equal(getAngleType(180.1), "Reflex angle"); + assert.equal(getAngleType(359.9), "Reflex angle"); +}); From b6b7084ac1a9618974b1e9f8cfed2c6afd009631 Mon Sep 17 00:00:00 2001 From: Brian Yorachi Date: Wed, 14 Oct 2026 13:55:14 +0100 Subject: [PATCH 4/6] Mirror angle boundary coverage in Jest --- .../rewrite-tests-with-jest/1-get-angle-type.test.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/implement-and-rewrite-tests/rewrite-tests-with-jest/1-get-angle-type.test.js b/implement-and-rewrite-tests/rewrite-tests-with-jest/1-get-angle-type.test.js index 0fa410fb8..413abc01b 100644 --- a/implement-and-rewrite-tests/rewrite-tests-with-jest/1-get-angle-type.test.js +++ b/implement-and-rewrite-tests/rewrite-tests-with-jest/1-get-angle-type.test.js @@ -19,3 +19,14 @@ test.each([ ])("classifies an angle of %i degrees", (angle, expectedType) => { expect(getAngleType(angle)).toEqual(expectedType); }); + +test.each([ + [0.1, "Acute angle"], + [89.9, "Acute angle"], + [90.1, "Obtuse angle"], + [179.9, "Obtuse angle"], + [180.1, "Reflex angle"], + [359.9, "Reflex angle"], +])("classifies a boundary-adjacent angle of %i degrees", (angle, expectedType) => { + expect(getAngleType(angle)).toEqual(expectedType); +}); From 23d327477eb1445b0792ef155783d357dd474057 Mon Sep 17 00:00:00 2001 From: Brian Yorachi Date: Wed, 14 Oct 2026 13:57:34 +0100 Subject: [PATCH 5/6] Cover every standard card combination --- .../3-get-card-value.test.js | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/implement-and-rewrite-tests/implement-tests-with-node-test/3-get-card-value.test.js b/implement-and-rewrite-tests/implement-tests-with-node-test/3-get-card-value.test.js index 09dc0d8a8..94ed72e33 100644 --- a/implement-and-rewrite-tests/implement-tests-with-node-test/3-get-card-value.test.js +++ b/implement-and-rewrite-tests/implement-tests-with-node-test/3-get-card-value.test.js @@ -16,6 +16,30 @@ test("Returns the value of aces and face cards", () => { assert.equal(getCardValue("K♥"), 10); }); +const ranks = [ + ["A", 11], + ["2", 2], + ["3", 3], + ["4", 4], + ["5", 5], + ["6", 6], + ["7", 7], + ["8", 8], + ["9", 9], + ["10", 10], + ["J", 10], + ["Q", 10], + ["K", 10], +]; + +for (const [rank, expectedValue] of ranks) { + for (const suit of ["♠", "♥", "♦", "♣"]) { + test(`Returns ${expectedValue} for ${rank}${suit}`, () => { + assert.equal(getCardValue(`${rank}${suit}`), expectedValue); + }); + } +} + test("Rejects invalid card strings", () => { assert.throws(() => getCardValue("invalid"), /Expected a number followed by a suit, but got "invalid"/, "Expected clear error"); assert.throws(() => getCardValue("1♠")); From 34499035ae1b1ad961aade488fbd5b4efee8d211 Mon Sep 17 00:00:00 2001 From: Brian Yorachi Date: Wed, 14 Oct 2026 13:59:55 +0100 Subject: [PATCH 6/6] Mirror exhaustive card coverage in Jest --- .../3-get-card-value.test.js | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/implement-and-rewrite-tests/rewrite-tests-with-jest/3-get-card-value.test.js b/implement-and-rewrite-tests/rewrite-tests-with-jest/3-get-card-value.test.js index b4fd3a4f5..1451079ce 100644 --- a/implement-and-rewrite-tests/rewrite-tests-with-jest/3-get-card-value.test.js +++ b/implement-and-rewrite-tests/rewrite-tests-with-jest/3-get-card-value.test.js @@ -12,6 +12,31 @@ test.each([ expect(getCardValue(card)).toEqual(expectedValue); }); +const ranks = [ + ["A", 11], + ["2", 2], + ["3", 3], + ["4", 4], + ["5", 5], + ["6", 6], + ["7", 7], + ["8", 8], + ["9", 9], + ["10", 10], + ["J", 10], + ["Q", 10], + ["K", 10], +]; +const suits = ["♠", "♥", "♦", "♣"]; + +test.each( + ranks.flatMap(([rank, expectedValue]) => + suits.map((suit) => [`${rank}${suit}`, expectedValue]), + ), +)("returns the expected value for %s", (card, expectedValue) => { + expect(getCardValue(card)).toEqual(expectedValue); +}); + test.each(["invalid", "1♠", "11♠", "A", "A X", "A🃏"])( "rejects invalid card %s", (card) => {