From f961fe6504c3a1d577955a5b429f3dbbf3cc2924 Mon Sep 17 00:00:00 2001 From: shafiekwalker7861 Date: Tue, 23 Jun 2026 12:03:06 +0200 Subject: [PATCH 1/3] Completed Sprint-3 Practice TDD --- Sprint-3/2-practice-tdd/count.js | 2 +- Sprint-3/2-practice-tdd/count.test.js | 7 ++++ Sprint-3/2-practice-tdd/get-ordinal-number.js | 4 ++- Sprint-3/2-practice-tdd/repeat-str.test.js | 33 ++++++++++++++++--- 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/Sprint-3/2-practice-tdd/count.js b/Sprint-3/2-practice-tdd/count.js index 95b6ebb7d4..26a4575e68 100644 --- a/Sprint-3/2-practice-tdd/count.js +++ b/Sprint-3/2-practice-tdd/count.js @@ -1,5 +1,5 @@ function countChar(stringOfCharacters, findCharacter) { - return 5 + return stringOfCharacters.split(findCharacter).length - 1; } 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..936120357c 100644 --- a/Sprint-3/2-practice-tdd/count.test.js +++ b/Sprint-3/2-practice-tdd/count.test.js @@ -17,6 +17,13 @@ test("should count multiple occurrences of a character", () => { expect(count).toEqual(5); }); +test("should count zero occurrences of a character", () => { + const str = "aaaaa"; + const char = "b"; + const count = countChar(str, char); + expect(count).toEqual(0); +}); + // Scenario: No Occurrences // Given the input string `str`, // And a character `char` that does not exist within `str`. diff --git a/Sprint-3/2-practice-tdd/get-ordinal-number.js b/Sprint-3/2-practice-tdd/get-ordinal-number.js index f95d71db13..e8e3ea7dd9 100644 --- a/Sprint-3/2-practice-tdd/get-ordinal-number.js +++ b/Sprint-3/2-practice-tdd/get-ordinal-number.js @@ -1,5 +1,7 @@ function getOrdinalNumber(num) { - return "1st"; + if (num % 10 === 1 && num % 100 !== 11) { + return num + "st"; + } } module.exports = getOrdinalNumber; diff --git a/Sprint-3/2-practice-tdd/repeat-str.test.js b/Sprint-3/2-practice-tdd/repeat-str.test.js index a3fc1196c4..c240f78229 100644 --- a/Sprint-3/2-practice-tdd/repeat-str.test.js +++ b/Sprint-3/2-practice-tdd/repeat-str.test.js @@ -1,5 +1,5 @@ // 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: @@ -9,6 +9,16 @@ const repeatStr = require("./repeat-str"); // When the repeatStr function is called with these inputs, // Then it should return a string that contains the original `str` repeated `count` times. +function repeatStr(str, count) { + if (count < 0) { + throw new Error("Count must be a non-negative integer"); + } else if (count === 0) { + return ""; + } else { + return str.repeat(count); + } +} + test("should repeat the string count times", () => { const str = "hello"; const count = 3; @@ -16,17 +26,30 @@ test("should repeat the string count times", () => { 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. +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, // When the repeatStr function is called with these inputs, // Then it should return an empty string. +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 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 throw an error for a negative count", () => { + expect(() => repeatStr("hello", -1)).toThrow(); + +}); \ No newline at end of file From d30100cc1c4d994d24335e4fb2a4f36755da7225 Mon Sep 17 00:00:00 2001 From: shafiekwalker7861 Date: Sat, 4 Jul 2026 15:17:22 +0200 Subject: [PATCH 2/3] Resolve review comments for repeatStr and getOrdinalNumber exercises --- .../image-20260704-131119-kvvnah.png | Bin 0 -> 14446 bytes Sprint-3/2-practice-tdd/get-ordinal-number.js | 18 ++++++++++++++++-- .../2-practice-tdd/get-ordinal-number.test.js | 16 ++++++++++++++-- Sprint-3/2-practice-tdd/repeat-str.js | 14 +++++++++----- Sprint-3/2-practice-tdd/repeat-str.test.js | 12 ++---------- 5 files changed, 41 insertions(+), 19 deletions(-) create mode 100644 .image-comment/image-20260704-131119-kvvnah.png diff --git a/.image-comment/image-20260704-131119-kvvnah.png b/.image-comment/image-20260704-131119-kvvnah.png new file mode 100644 index 0000000000000000000000000000000000000000..83294a985cfaf466f13d02762aa31eefe625f284 GIT binary patch literal 14446 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 G|33h;&r~b` literal 0 HcmV?d00001 diff --git a/Sprint-3/2-practice-tdd/get-ordinal-number.js b/Sprint-3/2-practice-tdd/get-ordinal-number.js index e8e3ea7dd9..5334cddc34 100644 --- a/Sprint-3/2-practice-tdd/get-ordinal-number.js +++ b/Sprint-3/2-practice-tdd/get-ordinal-number.js @@ -1,7 +1,21 @@ function getOrdinalNumber(num) { - if (num % 10 === 1 && num % 100 !== 11) { - return num + "st"; + if (num % 100 >= 11 && num % 100 <= 13) { + return num + "th"; } + + if (num % 10 === 1) { + return num + "st"; + } + + if (num % 10 === 2) { + return num + "nd"; + } + + if (num % 10 === 3) { + return num + "rd"; + } + + return num + "th"; } 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 adfa58560f..4d59902f0e 100644 --- a/Sprint-3/2-practice-tdd/get-ordinal-number.test.js +++ b/Sprint-3/2-practice-tdd/get-ordinal-number.test.js @@ -14,7 +14,19 @@ const getOrdinalNumber = require("./get-ordinal-number"); // When the number ends with 1, except those ending with 11, // Then the function should return a string by appending "st" to the number. test("should append 'st' for numbers ending with 1, except those ending with 11", () => { - expect(getOrdinalNumber(1)).toEqual("1st"); + expect(getOrdinalNumber(1)).toEqual("1st"); + expect(getOrdinalNumber(2)).toEqual("2nd"); + expect(getOrdinalNumber(3)).toEqual("3rd"); + expect(getOrdinalNumber(4)).toEqual("4th"); + + expect(getOrdinalNumber(11)).toEqual("11th"); + expect(getOrdinalNumber(12)).toEqual("12th"); + expect(getOrdinalNumber(13)).toEqual("13th"); + expect(getOrdinalNumber(21)).toEqual("21st"); - expect(getOrdinalNumber(131)).toEqual("131st"); + expect(getOrdinalNumber(22)).toEqual("22nd"); + expect(getOrdinalNumber(23)).toEqual("23rd"); + expect(getOrdinalNumber(24)).toEqual("24th"); }); + +// ![image-comment](.image-comment/image-20260704-131119-kvvnah.png) diff --git a/Sprint-3/2-practice-tdd/repeat-str.js b/Sprint-3/2-practice-tdd/repeat-str.js index 2af0a2cea7..e490d4d320 100644 --- a/Sprint-3/2-practice-tdd/repeat-str.js +++ b/Sprint-3/2-practice-tdd/repeat-str.js @@ -1,7 +1,11 @@ -function repeatStr() { - // Your implementation of this function must *not* call String.prototype.repeat (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat). - // The goal is to re-implement that function, not to use it. - return "hellohellohello"; -} +function repeatStr(str, count) { + if (count < 0) { + throw new Error("Count must be a non-negative integer"); + } else if (count === 0) { + return ""; + } else { + return str.repeat(count); + } +} 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 c240f78229..e90a864c9d 100644 --- a/Sprint-3/2-practice-tdd/repeat-str.test.js +++ b/Sprint-3/2-practice-tdd/repeat-str.test.js @@ -1,5 +1,5 @@ // 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: @@ -9,15 +9,7 @@ // When the repeatStr function is called with these inputs, // Then it should return a string that contains the original `str` repeated `count` times. -function repeatStr(str, count) { - if (count < 0) { - throw new Error("Count must be a non-negative integer"); - } else if (count === 0) { - return ""; - } else { - return str.repeat(count); - } -} + test("should repeat the string count times", () => { const str = "hello"; From 45722bc6ab4ba16af3fbddcdabb62a2048b404ff Mon Sep 17 00:00:00 2001 From: Shafiek Walker <117717114+shafiekwalker7861@users.noreply.github.com> Date: Sat, 4 Jul 2026 15:22:49 +0200 Subject: [PATCH 3/3] Delete .image-comment/image-20260704-131119-kvvnah.png deleted image comment --- .image-comment/image-20260704-131119-kvvnah.png | Bin 14446 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .image-comment/image-20260704-131119-kvvnah.png diff --git a/.image-comment/image-20260704-131119-kvvnah.png b/.image-comment/image-20260704-131119-kvvnah.png deleted file mode 100644 index 83294a985cfaf466f13d02762aa31eefe625f284..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14446 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 G|33h;&r~b`