From 206dc6822662495b1a28f6dfbc777b291ea34faa Mon Sep 17 00:00:00 2001 From: Richard Frimpong Date: Wed, 4 Mar 2026 04:10:02 +0000 Subject: [PATCH 1/3] Implement ordinal number suffix rules --- Sprint-3/2-practice-tdd/get-ordinal-number.js | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/Sprint-3/2-practice-tdd/get-ordinal-number.js b/Sprint-3/2-practice-tdd/get-ordinal-number.js index f95d71db13..0b592868f0 100644 --- a/Sprint-3/2-practice-tdd/get-ordinal-number.js +++ b/Sprint-3/2-practice-tdd/get-ordinal-number.js @@ -1,5 +1,26 @@ -function getOrdinalNumber(num) { - return "1st"; +function getOrdinalNumber(number) { + const lastTwoDigits = number % 100; + + // Special cases: 11, 12, 13 always use "th" + if (lastTwoDigits >= 11 && lastTwoDigits <= 13) { + return `${number}th`; + } + + const lastDigit = number % 10; + + if (lastDigit === 1) { + return `${number}st`; + } + + if (lastDigit === 2) { + return `${number}nd`; + } + + if (lastDigit === 3) { + return `${number}rd`; + } + + return `${number}th`; } -module.exports = getOrdinalNumber; +module.exports = getOrdinalNumber; \ No newline at end of file From 37c47d1acda5b8685f7b30731ca5d4113dd8de6c Mon Sep 17 00:00:00 2001 From: Richard Frimpong Date: Wed, 4 Mar 2026 04:10:14 +0000 Subject: [PATCH 2/3] Add Jest tests for ordinal number cases --- .../2-practice-tdd/get-ordinal-number.test.js | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/Sprint-3/2-practice-tdd/get-ordinal-number.test.js b/Sprint-3/2-practice-tdd/get-ordinal-number.test.js index adfa58560f..3bbba9fe54 100644 --- a/Sprint-3/2-practice-tdd/get-ordinal-number.test.js +++ b/Sprint-3/2-practice-tdd/get-ordinal-number.test.js @@ -18,3 +18,41 @@ test("should append 'st' for numbers ending with 1, except those ending with 11" expect(getOrdinalNumber(21)).toEqual("21st"); expect(getOrdinalNumber(131)).toEqual("131st"); }); + +// Case 2: Numbers ending with 2 (but not 12) +// When the number ends with 2, except those ending with 12, +// Then the function should return a string by appending "nd" to the number. +test("should append 'nd' for numbers ending with 2, except those ending with 12", () => { + expect(getOrdinalNumber(2)).toEqual("2nd"); + expect(getOrdinalNumber(22)).toEqual("22nd"); + expect(getOrdinalNumber(132)).toEqual("132nd"); +}); + +// Case 3: Numbers ending with 3 (but not 13) +// When the number ends with 3, except those ending with 13, +// Then the function should return a string by appending "rd" to the number. +test("should append 'rd' for numbers ending with 3, except those ending with 13", () => { + expect(getOrdinalNumber(3)).toEqual("3rd"); + expect(getOrdinalNumber(23)).toEqual("23rd"); + expect(getOrdinalNumber(133)).toEqual("133rd"); +}); + +// Case 4: Numbers ending with 11, 12, 13 (special cases) +// These numbers should always end with "th". +test("should append 'th' for numbers ending with 11, 12, or 13", () => { + expect(getOrdinalNumber(11)).toEqual("11th"); + expect(getOrdinalNumber(12)).toEqual("12th"); + expect(getOrdinalNumber(13)).toEqual("13th"); + expect(getOrdinalNumber(111)).toEqual("111th"); + expect(getOrdinalNumber(112)).toEqual("112th"); + expect(getOrdinalNumber(113)).toEqual("113th"); +}); + +// Case 5: All other numbers +// Numbers that do not end with 1, 2, or 3 should end with "th". +test("should append 'th' for all other numbers", () => { + expect(getOrdinalNumber(4)).toEqual("4th"); + expect(getOrdinalNumber(10)).toEqual("10th"); + expect(getOrdinalNumber(24)).toEqual("24th"); + expect(getOrdinalNumber(100)).toEqual("100th"); +}); \ No newline at end of file From 51bf74e0398b9a923bda4ffbbacf992c62f36186 Mon Sep 17 00:00:00 2001 From: Richard Frimpong Date: Thu, 12 Mar 2026 01:20:49 +0000 Subject: [PATCH 3/3] Complete Sprint 3 practice TDD tasks --- Sprint-3/2-practice-tdd/count.js | 12 ++++- Sprint-3/2-practice-tdd/count.test.js | 25 +++++++++- Sprint-3/2-practice-tdd/get-ordinal-number.js | 2 +- .../2-practice-tdd/get-ordinal-number.test.js | 2 +- Sprint-3/2-practice-tdd/repeat-str.js | 18 ++++++- Sprint-3/2-practice-tdd/repeat-str.test.js | 47 ++++++++++++++----- 6 files changed, 87 insertions(+), 19 deletions(-) diff --git a/Sprint-3/2-practice-tdd/count.js b/Sprint-3/2-practice-tdd/count.js index 95b6ebb7d4..d81e8f0a98 100644 --- a/Sprint-3/2-practice-tdd/count.js +++ b/Sprint-3/2-practice-tdd/count.js @@ -1,5 +1,15 @@ +// implement a function countChar that counts the number of times a character occurs in a string + function countChar(stringOfCharacters, findCharacter) { - return 5 + let count = 0; + + for (const character of stringOfCharacters) { + if (character === findCharacter) { + count += 1; + } + } + + return count; } module.exports = countChar; diff --git a/Sprint-3/2-practice-tdd/count.test.js b/Sprint-3/2-practice-tdd/count.test.js index 179ea0ddf7..6856783c0a 100644 --- a/Sprint-3/2-practice-tdd/count.test.js +++ b/Sprint-3/2-practice-tdd/count.test.js @@ -1,5 +1,6 @@ // implement a function countChar that counts the number of times a character occurs in a string const countChar = require("./count"); + // Given a string `str` and a single character `char` to search for, // When the countChar function is called with these inputs, // Then it should: @@ -14,6 +15,7 @@ test("should count multiple occurrences of a character", () => { const str = "aaaaa"; const char = "a"; const count = countChar(str, char); + expect(count).toEqual(5); }); @@ -21,4 +23,25 @@ test("should count multiple occurrences of a character", () => { // Given the input string `str`, // And a character `char` that does not exist within `str`. // When the function is called with these inputs, -// Then it should return 0, indicating that no occurrences of `char` were found. +// Then it should return 0. + +test("should return 0 when the character does not occur in the string", () => { + const str = "hello"; + const char = "z"; + const count = countChar(str, char); + + expect(count).toEqual(0); +}); + +// Scenario: Mixed Characters +// Given a string containing different characters +// When searching for a character that appears some of the time +// Then the function should count only matching characters + +test("should count matching characters in a mixed string", () => { + const str = "banana"; + const char = "a"; + const count = countChar(str, char); + + expect(count).toEqual(3); +}); diff --git a/Sprint-3/2-practice-tdd/get-ordinal-number.js b/Sprint-3/2-practice-tdd/get-ordinal-number.js index 0b592868f0..5cdcab7352 100644 --- a/Sprint-3/2-practice-tdd/get-ordinal-number.js +++ b/Sprint-3/2-practice-tdd/get-ordinal-number.js @@ -23,4 +23,4 @@ function getOrdinalNumber(number) { return `${number}th`; } -module.exports = getOrdinalNumber; \ No newline at end of file +module.exports = getOrdinalNumber; diff --git a/Sprint-3/2-practice-tdd/get-ordinal-number.test.js b/Sprint-3/2-practice-tdd/get-ordinal-number.test.js index 3bbba9fe54..ac118b2686 100644 --- a/Sprint-3/2-practice-tdd/get-ordinal-number.test.js +++ b/Sprint-3/2-practice-tdd/get-ordinal-number.test.js @@ -55,4 +55,4 @@ test("should append 'th' for all other numbers", () => { expect(getOrdinalNumber(10)).toEqual("10th"); expect(getOrdinalNumber(24)).toEqual("24th"); expect(getOrdinalNumber(100)).toEqual("100th"); -}); \ No newline at end of file +}); diff --git a/Sprint-3/2-practice-tdd/repeat-str.js b/Sprint-3/2-practice-tdd/repeat-str.js index 3838c7b003..9b3e787d88 100644 --- a/Sprint-3/2-practice-tdd/repeat-str.js +++ b/Sprint-3/2-practice-tdd/repeat-str.js @@ -1,5 +1,19 @@ -function repeatStr() { - return "hellohellohello"; +// Implement a function repeatStr that repeats a string a given number of times + +function repeatStr(str, count) { + // Negative numbers are not valid + if (count < 0) { + throw new Error("Count cannot be negative"); + } + + // Repeat the string count times + let result = ""; + + for (let i = 0; i < count; i++) { + result += str; + } + + return result; } module.exports = repeatStr; diff --git a/Sprint-3/2-practice-tdd/repeat-str.test.js b/Sprint-3/2-practice-tdd/repeat-str.test.js index a3fc1196c4..3170cc170a 100644 --- a/Sprint-3/2-practice-tdd/repeat-str.test.js +++ b/Sprint-3/2-practice-tdd/repeat-str.test.js @@ -1,32 +1,53 @@ // Implement a function repeatStr const repeatStr = require("./repeat-str"); + // Given a target string `str` and a positive integer `count`, // When the repeatStr function is called with these inputs, // Then it should: -// Case: handle multiple repetitions: +// Case: handle multiple repetitions // Given a target string `str` and a positive integer `count` greater than 1, -// When the repeatStr function is called with these inputs, // Then it should return a string that contains the original `str` repeated `count` times. test("should repeat the string count times", () => { const str = "hello"; const count = 3; const repeatedStr = repeatStr(str, count); + expect(repeatedStr).toEqual("hellohellohello"); }); -// Case: handle count of 1: -// Given a target string `str` and a `count` equal to 1, -// When the repeatStr function is called with these inputs, -// Then it should return the original `str` without repetition. +// Case: handle count of 1 +// Given a target string `str` and a count equal to 1, +// Then it should return the original string. -// Case: Handle count of 0: -// Given a target string `str` and a `count` equal to 0, -// When the repeatStr function is called with these inputs, +test("should return the original string when count is 1", () => { + const str = "hello"; + const count = 1; + const repeatedStr = repeatStr(str, count); + + expect(repeatedStr).toEqual("hello"); +}); + +// Case: handle count of 0 +// Given a target string `str` and a count equal to 0, // Then it should return an empty string. -// Case: Handle negative count: -// Given a target string `str` and a negative integer `count`, -// When the repeatStr function is called with these inputs, -// Then it should throw an error, as negative counts are not valid. +test("should return an empty string when count is 0", () => { + const str = "hello"; + const count = 0; + const repeatedStr = repeatStr(str, count); + + expect(repeatedStr).toEqual(""); +}); + +// Case: handle negative count +// Given a negative integer count, +// Then the function should throw an error. + +test("should throw an error when count is negative", () => { + const str = "hello"; + const count = -1; + + expect(() => repeatStr(str, count)).toThrow(); +});