Skip to content
15 changes: 11 additions & 4 deletions Sprint-3/2-practice-tdd/count.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
function countChar(stringOfCharacters, findCharacter) {
return 5
}
function countChar(str, char) {
let count = 0;

for (let i = 0; i < str.length; i++) {//loop through each character in the string
if (str[i] === char) {//check if the character matches the target character
count = count + 1;
}
}

module.exports = countChar;
return count;//return the final count
}
module.exports = countChar;
24 changes: 21 additions & 3 deletions Sprint-3/2-practice-tdd/count.test.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,29 @@
// 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:
// Scenario: Single Occurrence

test("counts a single occurrence of a character", () => {
expect(countChar("hello", "h")).toEqual(1);
expect(countChar("world", "d")).toEqual(1);
});
// Scenario: Multiple Occurrences
// Given the input string str,
// And a character char that may occur multiple times with overlaps within str (e.g., 'a' in 'aaaaa'),
// When the function is called with these inputs,
// Then it should correctly count overlapping occurrences of char (e.g., 'a' appears five times in 'aaaaa').
test("counts multiple occurrences of a character", () => {
expect(countChar("banana", "a")).toEqual(3);
expect(countChar("mississippi", "s")).toEqual(4);
});

test("should count multiple occurrences of a character", () => {
const str = "aaaaa";
const char = "a";
const count = countChar(str, char);
const Char = "a";
const count = countChar(str,Char);
expect(count).toEqual(5);
});
Copy link
Contributor

Choose a reason for hiding this comment

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

Could also merge this test into the previous test (they both test "multiple occurrences").

Copy link
Author

Choose a reason for hiding this comment

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

I have updated the test


Expand All @@ -22,3 +32,11 @@ test("should count multiple occurrences of a character", () => {
// And a character char that does not exist within the case-sensitive str,
// When the function is called with these inputs,
// Then it should return 0, indicating that no occurrences of the char were found in the case-sensitive str.
// Scenario: No Occurrences
test("should return 0 if the character is not in the string", () => {
const str = "hello";
const char = "x"; // character not present in str
const count = countChar(str, char);
expect(count).toEqual(0);
});

18 changes: 17 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,21 @@
function getOrdinalNumber(num) {
return "1st";
const lastTwoDigits = num % 100; // check the last 2 digits for 11,12,13
const lastDigit = num % 10;

if (lastTwoDigits >= 11 && lastTwoDigits <= 13) {
return num + "th";
}

switch (lastDigit) {
case 1:
return num + "st";
case 2:
return num + "nd";
case 3:
return num + "rd";
default:
return num + "th";
}
}

module.exports = getOrdinalNumber;
10 changes: 10 additions & 0 deletions Sprint-3/2-practice-tdd/get-ordinal-number.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,13 @@ const getOrdinalNumber = require("./get-ordinal-number");
test("should return '1st' for 1", () => {
expect(getOrdinalNumber(1)).toEqual("1st");
});
test("should return 'th' for 11, 12, 13", () => {
expect(getOrdinalNumber(11)).toBe("11th");
expect(getOrdinalNumber(12)).toBe("12th");
expect(getOrdinalNumber(13)).toBe("13th");
});
test("should return correct ordinal for numbers > 20", () => {
expect(getOrdinalNumber(21)).toBe("21st");
expect(getOrdinalNumber(22)).toBe("22nd");
expect(getOrdinalNumber(23)).toBe("23rd");
});
Copy link
Contributor

Choose a reason for hiding this comment

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

To ensure thorough testing, we need broad scenarios that cover all possible cases.

  • Listing individual values can quickly lead to an unmanageable number of test cases. You can consider generalise the first test to cover all numbers ending in 1 (but not in 11).

  • Creating a category for "11, 12, 13" is good. You can also generalise the test to cover all numbers ending in 11, 12, 13.

  • "All numbers > 20" as one category might be too broad.

Copy link
Author

Choose a reason for hiding this comment

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

More testing scenarios were added

7 changes: 5 additions & 2 deletions Sprint-3/2-practice-tdd/repeat.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
function repeat() {
return "hellohellohello";
function repeat(word, times) {
if (times < 0) {
throw new Error("Count must be a non-negative number");
}
return word.repeat(times);
}

module.exports = repeat;
14 changes: 12 additions & 2 deletions Sprint-3/2-practice-tdd/repeat.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,23 @@ test("should repeat the string count times", () => {
// Given a target string str and a count equal to 1,
// When the repeat function is called with these inputs,
// Then it should return the original str without repetition, ensuring that a count of 1 results in no repetition.

test("should repeat the string count times", () => {
const str = "hello";
const count = 1;
const repeatedStr = repeat(str, count);
expect(repeatedStr).toEqual("hello");
});
// case: Handle Count of 0:
// Given a target string str and a count equal to 0,
// When the repeat function is called with these inputs,
// Then it should return an empty string, ensuring that a count of 0 results in an empty output.

test("should return empty string when times is 0", () => {
expect(repeat("hello", 0)).toEqual("");
});
// case: Negative Count:
// Given a target string str and a negative integer count,
// When the repeat function is called with these inputs,
// Then it should throw an error or return an appropriate error message, as negative counts are not valid.
test("should throw an error when count is negative", () => {
expect(() => repeat("hello", -3)).toThrow("Count must be a non-negative number");
});
Loading