Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
0b65a57
feat: implement countChar function
Feb 25, 2026
18ef756
test: add unit tests for countChar function
Feb 25, 2026
9d908d9
Implement getOrdinalNumber with correct suffix logic
Feb 25, 2026
715c649
Add category-based tests for ordinal number suffixes (st, nd, rd, th)…
Feb 25, 2026
2af6c11
test: add tests for repeatStr
Feb 26, 2026
4098eb1
Co-authored-by: Isaac Abodunrin <bytesandroses@users.noreply.github.com>
Feb 28, 2026
77bc6be
refactor: simplify repeatStr using String.prototype.repeat
Mar 2, 2026
b7a3a6f
Revert to main branch
Mar 2, 2026
92422ef
Co-authored-by: Isaac Abodunrin <bytesandroses@users.noreply.github.c…
Mar 2, 2026
444a5ec
revert to main
Mar 2, 2026
5ae7a46
revert to main
Mar 2, 2026
d7f002f
revert to main
Mar 2, 2026
cf348b5
test: add unit tests for repeatStr function
Mar 12, 2026
37b2b72
Add test case for non-alphabet characters in countChar
Mar 12, 2026
5497cfe
test: clarify ordinal 'th' test case description
Mar 12, 2026
7217ad7
fix: remove duplicate getAngleType function and ensure correct implem…
Mar 12, 2026
607161c
test: improve getOrdinalNumber test descriptions and coverage
Mar 12, 2026
65182a5
deleted un related file
Mar 13, 2026
ab1f15e
reverted to previous description
Mar 13, 2026
f980882
fixed the function
Mar 13, 2026
77df336
Remove unrelated sprint folders from PR
Mar 13, 2026
ff3d1d3
restored deleted files
Mar 15, 2026
2dd8a26
Merge branch 'main' into coursework/sprint-3-practice-tdd
Pretty548 Mar 15, 2026
32f9cc1
restored the deleted file
Mar 15, 2026
15df447
Merge branch 'coursework/sprint-3-practice-tdd' of https://github.com…
Mar 15, 2026
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
8 changes: 7 additions & 1 deletion Sprint-3/2-practice-tdd/count.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
function countChar(stringOfCharacters, findCharacter) {
return 5
let count = 0;
for (let i = 0; i < stringOfCharacters.length; i++) {
if (stringOfCharacters[i] === findCharacter) {
count++;
}
}
return count;
}

module.exports = countChar;
24 changes: 24 additions & 0 deletions Sprint-3/2-practice-tdd/count.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@ 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:
// - Iterate through each character in `str`.
// - Compare each character to `char`.
// - Increment a counter each time a match is found.
// - Return the final count of occurrences of `char` in `str`.

// Scenario: Multiple Occurrences
// Given the input string `str`,
Expand All @@ -22,3 +26,23 @@ test("should count multiple occurrences of a character", () => {
// 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.
test("should return 0 when the character does not occur in the string", () => {
const str = "hello world";
const char = "x";
const count = countChar(str, char);
expect(count).toEqual(0);
});
// Scenario: Case Sensitivity
test("should be case sensitive", () => {
const str = "Hello World";
const char = "H";
const count = countChar(str, char);
expect(count).toEqual(1);
});

test("should count non-alphabet characters", () => {
const str = "hello!!!";
const char = "!";
const count = countChar(str, char);
expect(count).toEqual(3);
});
4 changes: 3 additions & 1 deletion Sprint-3/2-practice-tdd/get-ordinal-number.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
function getOrdinalNumber(num) {
return "1st";
const suffixes = ["th", "st", "nd", "rd"];
const v = num % 100;
return num + (suffixes[(v - 20) % 10] || suffixes[v] || suffixes[0]);
}

module.exports = getOrdinalNumber;
39 changes: 33 additions & 6 deletions Sprint-3/2-practice-tdd/get-ordinal-number.test.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,26 @@
const getOrdinalNumber = require("./get-ordinal-number");
// In this week's prep, we started implementing getOrdinalNumber.
test("should append 'st' for numbers ending with 1, except those ending with 11", () => {
expect(getOrdinalNumber(1)).toEqual("1st");
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");
});

// Continue testing and implementing getOrdinalNumber for additional cases.
// Write your tests using Jest — remember to run your tests often for continual feedback.

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");
});
// To ensure thorough testing, we need broad scenarios that cover all possible cases.
// Listing individual values, however, can quickly lead to an unmanageable number of test cases.
// Instead of writing tests for individual numbers, consider grouping all possible input values
Expand All @@ -13,8 +30,18 @@ const getOrdinalNumber = require("./get-ordinal-number");
// Case 1: Numbers ending with 1 (but not 11)
// 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(21)).toEqual("21st");
expect(getOrdinalNumber(131)).toEqual("131st");
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");
});

// Case 4: Numbers ending with 0 or 4–9
// When the number ends with 0 or digits 4–9,
// Then the function should return a string by appending "th".
test("should append 'th' for numbers ending with 0 or 4–9", () => {
expect(getOrdinalNumber(4)).toEqual("4th");
expect(getOrdinalNumber(10)).toEqual("10th");
expect(getOrdinalNumber(14)).toEqual("14th");
expect(getOrdinalNumber(100)).toEqual("100th");
});
11 changes: 9 additions & 2 deletions Sprint-3/2-practice-tdd/repeat-str.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
function repeatStr() {
return "hellohellohello";
function repeatStr(n, str) {
if (!Number.isInteger(n) || n < 0) {
throw new Error("Count must be a non-negative integer");
}
let result = "";
for (let i = 0; i < n; i++) {
result += str;
}
return result;
}

module.exports = repeatStr;
54 changes: 33 additions & 21 deletions Sprint-3/2-practice-tdd/repeat-str.test.js
Original file line number Diff line number Diff line change
@@ -1,32 +1,44 @@
// 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:
// 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.

// Case: repeat string multiple times
test("should repeat the string count times", () => {
const str = "hello";
const count = 3;
const repeatedStr = repeatStr(str, count);
const repeatedStr = repeatStr(count, str);
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: count = 1
test("should return the original string when count is 1", () => {
const str = "hello";
const count = 1;
const repeatedStr = repeatStr(count, str);
expect(repeatedStr).toEqual("hello");
});

// Case: count = 0
test("should return an empty string when count is 0", () => {
const str = "hello";
const count = 0;
const repeatedStr = repeatStr(count, str);
expect(repeatedStr).toEqual("");
});

// 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.
// Case: negative count
test("should throw an error when count is negative", () => {
const str = "hello";
const count = -1;
expect(() => repeatStr(count, str)).toThrow(
"Count must be a non-negative integer"
);
});

// 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.
// Case: non-integer count
test("should throw an error when count is not an integer", () => {
const str = "hello";
const count = 2.5;
expect(() => repeatStr(count, str)).toThrow(
"Count must be a non-negative integer"
);
});
Loading