Skip to content
Open
Show file tree
Hide file tree
Changes from 8 commits
Commits
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
4 changes: 3 additions & 1 deletion Sprint-3/2-practice-tdd/count.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
function countChar(stringOfCharacters, findCharacter) {
return 5
const charRegex = new RegExp(findCharacter, "g");
const charArr = [...stringOfCharacters.matchAll(charRegex)];
return charArr.length;
}

module.exports = countChar;
7 changes: 7 additions & 0 deletions Sprint-3/2-practice-tdd/count.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,10 @@ 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 count 0 occurrences of a character", () => {
const str = "dog";
const char = "a";
const count = countChar(str, char);
expect(count).toEqual(0);
Comment on lines +27 to +30
Copy link
Copy Markdown
Contributor

@cjyuan cjyuan Mar 6, 2026

Choose a reason for hiding this comment

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

  • Could consider testing more samples.

  • Could consider test these cases:

    • A case to show that the match is case sensitive
    • A case to show that the function should work also for non-alphabets
      • Currently your function does not work properly when char is a certain non-alphabet character that has special meaning in regex.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Thank you CJ, I reviewed your comment, and I think I'm now covering all the cases you mentioned.
This was actually really fun to work on. I've been learning a lot about working with regex.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Seems to work ok now.

I am glad you learned something more about regex.

It is ok to use this approach in this course but I wouldn't recommend it in practice for such a task.
Can you find out (maybe from AI) the pros and cons using this approach to count characters?

});
9 changes: 8 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,12 @@
function getOrdinalNumber(num) {
return "1st";
const lastTwoDigits = num % 100;
if (lastTwoDigits === 11 || lastTwoDigits === 12 || lastTwoDigits === 13)
return `${num}th`;
const lastDigit = num % 10;
if (lastDigit === 1) return `${num}st`;
if (lastDigit === 2) return `${num}nd`;
if (lastDigit === 3) return `${num}rd`;
return `${num}th`;
}

module.exports = getOrdinalNumber;
28 changes: 28 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 @@ -18,3 +18,31 @@ test("should append 'st' for numbers ending with 1, except those ending with 11"
expect(getOrdinalNumber(21)).toEqual("21st");
expect(getOrdinalNumber(131)).toEqual("131st");
});

test("should append 'nd' for numbers ending with 2, except those ending with 12", () => {
expect(getOrdinalNumber(2)).toEqual("2nd");
expect(getOrdinalNumber(42)).toEqual("42nd");
expect(getOrdinalNumber(782)).toEqual("782nd");
});

test("should append 'rd' for numbers ending with 3, except those ending with 13", () => {
expect(getOrdinalNumber(3)).toEqual("3rd");
expect(getOrdinalNumber(93)).toEqual("93rd");
expect(getOrdinalNumber(7253)).toEqual("7253rd");
});

test("should append 'th' for numbers ending with numbers 0 or 4-9", () => {
expect(getOrdinalNumber(20)).toEqual("20th");
expect(getOrdinalNumber(75)).toEqual("75th");
expect(getOrdinalNumber(567)).toEqual("567th");
expect(getOrdinalNumber(2574)).toEqual("2574th");
});

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(512)).toEqual("512th");
expect(getOrdinalNumber(113)).toEqual("113th");
expect(getOrdinalNumber(6411)).toEqual("6411th");
});
5 changes: 3 additions & 2 deletions Sprint-3/2-practice-tdd/repeat-str.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
function repeatStr() {
return "hellohellohello";
function repeatStr(str, count) {
if (count < 0) throw new Error("Invalid format: count cannot be negative");
return str.repeat(count);
}

module.exports = repeatStr;
21 changes: 21 additions & 0 deletions Sprint-3/2-practice-tdd/repeat-str.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,33 @@ test("should repeat the string count times", () => {
// 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 when count is negative", () => {
const str = "hello";
const count = -6;
const repeatedStr = () => repeatStr(str, count);
expect(repeatedStr).toThrow(/Invalid format/);
});