Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
19 changes: 18 additions & 1 deletion Sprint-3/2-practice-tdd/count.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,22 @@
/**
* Counts how many times a single character appears in a string.
*
* @param {string} stringOfCharacters - The string to search through.
* @param {string} findCharacter - The single character to count.
* @returns {number} The number of times findCharacter appears in stringOfCharacters.
*
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of
*/

function countChar(stringOfCharacters, findCharacter) {
return 5
let count = 0;
for (const char of stringOfCharacters) {
if (char === findCharacter) {
count++; // this means count = count + 1. This term is called
// "incrementing" the count variable.
}
}
return count;
}

module.exports = countChar;
17 changes: 17 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,20 @@ 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 for Scenario "No Occurrences" — char isn't in the string, expect 0
test("should return 0 when the character is not found", () => {
const str = "fiendish";
const char = "a";
const count = countChar(str, char);
expect(count).toEqual(0);
});

// extra edge case — counts 's' in "Mississippi" (should be 4)
// Good real-world style input to make sure the loop works across a longer string.
test("should count occurrences correctly in a mixed string", () => {
const str = "Apple";
const char = "p";
const count = countChar(str, char);
expect(count).toEqual(2);
});
40 changes: 38 additions & 2 deletions Sprint-3/2-practice-tdd/get-ordinal-number.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,41 @@
/**
* Converts a number into its ordinal string form (e.g. 1 → "1st", 2 → "2nd").
*
* English ordinal rules:
* - Numbers ending in 11, 12, or 13 always use "th" (they are exceptions).
* - Numbers ending in 1 (but not 11) use "st".
* - Numbers ending in 2 (but not 12) use "nd".
* - Numbers ending in 3 (but not 13) use "rd".
* - Everything else uses "th".
*
* @param {number} num - A positive whole number (e.g. 1, 22, 113).
* @returns {string} The number with its ordinal suffix appended (e.g. "1st", "22nd").
*
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Remainder
* @see https://www.freecodecamp.org/news/javascript-modulo-operator/
*/
function getOrdinalNumber(num) {
return "1st";
// % is the "remainder" operator (also called modulo).
// num % 100 gives the last two digits of any number.
// e.g. 113 % 100 = 13, so we catch the 11/12/13 exceptions correctly.
const lastTwoDigits = num % 100;

// num % 10 gives the last single digit of any number.
// e.g. 21 % 10 = 1, so we know it ends in 1 → "st".
const lastDigit = num % 10;

// Check the 11/12/13 exceptions FIRST.
// If we checked lastDigit first, 11 would wrongly get "st" instead of "th".
if (lastTwoDigits === 11 || lastTwoDigits === 12 || lastTwoDigits === 13) {
return num + "th";
}

if (lastDigit === 1) return num + "st";
if (lastDigit === 2) return num + "nd";
if (lastDigit === 3) return num + "rd";

// All remaining numbers (4–9, 0, and any not caught above) use "th".
return num + "th";
}

module.exports = getOrdinalNumber;
module.exports = getOrdinalNumber;
40 changes: 40 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,43 @@ 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, or 13
// When the number ends with 11, 12, or 13,
// Then the function should return a string by appending "th" to the number.
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 5: All other numbers
// When the number does not end with 1, 2, or 3 (and is not an exception),
// Then the function should return a string by appending "th" to the number.
test("should append 'th' for all other numbers", () => {
expect(getOrdinalNumber(4)).toEqual("4th");
expect(getOrdinalNumber(10)).toEqual("10th");
expect(getOrdinalNumber(20)).toEqual("20th");
expect(getOrdinalNumber(100)).toEqual("100th");
expect(getOrdinalNumber(111)).toEqual("111th");
});


27 changes: 23 additions & 4 deletions Sprint-3/2-practice-tdd/repeat-str.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,26 @@
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";
/**
* Repeats a string a given number of times.
* This re-implements String.prototype.repeat without using it.
*
* @param {string} str - The string to repeat.
* @param {number} count - How many times to repeat it. Must be 0 or greater.
* @returns {string} The string repeated count times, or "" if count is 0.
* @throws {Error} If count is negative.
*
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for
*/
function repeatStr(str, count) {
if (count < 0) {
throw new Error("count must be 0 or greater");
}

let result = "";

for (let i = 1; i < count; i++) {
result = result + str;
}

return result;
}

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