Skip to content
Closed
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,19 @@ function getAngleType(angle) {
return "Right angle";
}
// Run the tests, work out what Case 2 is testing, and implement the required code here.
// Then keep going for the other cases, one at a time.
// Then keep going for the other cases, one at a time.
if (angle < 90) {
return "Acute angle";
}
if (angle > 90 && angle < 180) {
return "Obtuse angle";
}
if (angle === 180) {
return "Straight angle";
}
if (angle > 180 && angle < 360) {
return "Reflex angle";
}
}

// The line below allows us to load the getAngleType function into tests in other files.
Expand Down Expand Up @@ -51,13 +63,18 @@ assertEquals(acute, "Acute angle");
// Then the function should return "Obtuse angle"
const obtuse = getAngleType(120);
// ====> write your test here, and then add a line to pass the test in the function above
assertEquals(obtuse, "Obtuse angle");

// Case 4: Identify Straight Angles:
// When the angle is exactly 180 degrees,
// Then the function should return "Straight angle"
// ====> write your test here, and then add a line to pass the test in the function above
const straight = getAngleType(180);
assertEquals(straight, "Straight angle/line");

// Case 5: Identify Reflex Angles:
// When the angle is greater than 180 degrees and less than 360 degrees,
// Then the function should return "Reflex angle"
// ====> write your test here, and then add a line to pass the test in the function above
// ====> write your test here, and then add a line to pass the test in the function above
const reflex = getAngleType(270);
assertEquals(reflex, "Reflex angle");
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@
// write one test at a time, and make it pass, build your solution up methodically

function isProperFraction(numerator, denominator) {
if (numerator < denominator) {
if (Math.abs(numerator) < Math.abs(denominator)) {
return true;
}
return false;
}

// The line below allows us to load the isProperFraction function into tests in other files.
Expand Down Expand Up @@ -47,13 +48,34 @@ assertEquals(improperFraction, false);
// Explanation: The fraction -4/7 is a proper fraction because the absolute value of the numerator (4) is less than the denominator (7). The function should return true.
const negativeFraction = isProperFraction(-4, 7);
// ====> complete with your assertion
assertEquals(negativeFraction, true);

// Equal Numerator and Denominator check:
// Input: numerator = 3, denominator = 3
// target output: false
// Explanation: The fraction 3/3 is not a proper fraction because the numerator is equal to the denominator. The function should return false.
const equalFraction = isProperFraction(3, 3);
// ====> complete with your assertion
assertEquals(equalFraction, false);

// Stretch:
// What other scenarios could you test for?
// What other scenarios could you test for? Zero numerator => always proper
const zeroNumerator = isProperFraction(0, 10);
assertEquals(zeroNumerator, true);

//Negarive denominator => use absoluet values
const negativeDenominator = isProperFraction(3, -5);
assertEquals(negativeDenominator, true);

//Both negatives
const bothNegative = isProperFraction(-2, -3);
assertEquals(bothNegative, true);

//fractions like 8/8 should be false
const improperEqual = isProperFraction(9, 9);
assertEquals(improperEqual, false);

//zero denominator - maths says undefined so can return false or throw error
const zeroDenominator = isProperFraction(1, 0);
assertEquals(zeroDenominator, false);

Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,19 @@
// write one test at a time, and make it pass, build your solution up methodically
// just make one change at a time -- don't rush -- programmers are deep and careful thinkers
function getCardValue(card) {
if (rank === "A") {
return 11;
const rank = card.slice(0, -1); //everything except the suit
if (rank === "A") return 11;

if (["J", "Q", "K", "10"].includes(rank)) {
return 10;
}

const num = Number(rank);
if (!isNaN(num) && num >= 2 && num <= 9) {
return num;
}
throw new Error("Invalid card rank");

}

// The line below allows us to load the getCardValue function into tests in other files.
Expand Down Expand Up @@ -40,11 +50,24 @@ assertEquals(aceofSpades, 11);
// Then it should return the numeric value corresponding to the rank (e.g., "5" should return 5).
const fiveofHearts = getCardValue("5♥");
// ====> write your test here, and then add a line to pass the test in the function above
assertEquals(fiveofHearts, 5);

// Handle Face Cards (J, Q, K):
// Given a card with a rank of "10," "J," "Q," or "K",
// When the function is called with such a card,
// Then it should return the value 10, as these cards are worth 10 points each in blackjack.
const jack = getCardValue("J♣");
assertEquals(jack, 10);

const queen = getCardValue("Q♦");
assertEquals(queen, 10);

const king = getCardValue("K♥");
assertEquals(king, 10);

const ten = getCardValue("10♠");
assertEquals(ten, 10);


// Handle Ace (A):
// Given a card with a rank of "A",
Expand All @@ -55,3 +78,10 @@ const fiveofHearts = getCardValue("5♥");
// Given a card with an invalid rank (neither a number nor a recognized face card),
// When the function is called with such a card,
// Then it should throw an error indicating "Invalid card rank."
try {
getCardValue("Z♠");
console.assert(false, "Expected an error for invalid rank");
} catch (e) {
assertEquals(e.message, "Invalid card rank");
}

Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,34 @@ test("should identify right angle (90°)", () => {
// Case 2: Identify Acute Angles:
// When the angle is less than 90 degrees,
// Then the function should return "Acute angle"
test("should identify acute angles (< 90°)", () => {
expect(getAngleType(30)).toEqual("Acute angle");
expect(getAngleType(1)).toEqual("Acute angle");
expect(getAngleType(89)).toEqual("Acute angle");
});

// Case 3: Identify Obtuse Angles:
// When the angle is greater than 90 degrees and less than 180 degrees,
// Then the function should return "Obtuse angle"
test("should identify obtuse angles (90° < angle < 180°)", () => {
expect(getAngleType(120)).toEqual("Obtuse angle");
expect(getAngleType(100)).toEqual("Obtuse angle");
expect(getAngleType(179)).toEqual("Obtuse angle");
});


// Case 4: Identify Straight Angles:
// When the angle is exactly 180 degrees,
// Then the function should return "Straight angle"
test("should identify straight angles (180°)", () => {
expect(getAngleType(180)).toEqual("Straight angle");
});

// Case 5: Identify Reflex Angles:
// When the angle is greater than 180 degrees and less than 360 degrees,
// Then the function should return "Reflex angle"
test("should identify reflex angles (180° < angle < 360°)", () => {
expect(getAngleType(200)).toEqual("Reflex angle");
expect(getAngleType(250)).toEqual("Reflex angle");
expect(getAngleType(359)).toEqual("Reflex angle");
});
9 changes: 8 additions & 1 deletion 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
let count = 0;

for (let char of stringOfCharacters) {
if (char === findCharacter) {
count++;
}
}
return count;
}

module.exports = countChar;
15 changes: 15 additions & 0 deletions Sprint-3/2-practice-tdd/count.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ const countChar = require("./count");
// 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("should count multiple occurrences of a character", () => {
const str = "aaaaa";
const char = "a";
Expand All @@ -22,3 +23,17 @@ 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.

test("should return 0 when character does not exist in the string", () => {
const str = "hello world";
const char = "z";
const count = countChar(str, char);
expect(count).toEqual(0);
});


// Add case sensitivity tests
test("should be case-sensitive", () => {
expect(countChar("AaAa", "A")).toEqual(2);
expect(countChar("AaAa", "a")).toEqual(2);
});
15 changes: 14 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,18 @@
function getOrdinalNumber(num) {
return "1st";
const lastTwo = num % 100;
const last = num % 10;

// Special exceptions: 11, 12, 13
if (lastTwo === 11 || lastTwo === 12 || lastTwo === 13) {
return `${num}th`;
}

// Regular cases
if (last === 1) return `${num}st`;
if (last === 2) return `${num}nd`;
if (last === 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 @@ -11,3 +11,31 @@ const getOrdinalNumber = require("./get-ordinal-number");
test("should return '1st' for 1", () => {
expect(getOrdinalNumber(1)).toEqual("1st");
});

//identify ordinal for 2
test("should return '2nd' for 2", () => {
expect(getOrdinalNumber(2)).toEqual("2nd");
});

//identify ordinal for 3
test("should return '3rd' for 3", () => {
expect(getOrdinalNumber(3)).toEqual("3rd");
});

//identify ordinal for 4
test("should return '4th' for 4", () => {
expect(getOrdinalNumber(4)).toEqual("4th");
});

//Special English Rule... 12, 13, 14 ending in "th"
test("should return '11th' for 11", () => {
expect(getOrdinalNumber(11)).toEqual("11th");
});

test("should return '12th' for 12", () => {
expect(getOrdinalNumber(12)).toEqual("12th");
});

test("should return '13th' for 13", () => {
expect(getOrdinalNumber(13)).toEqual("13th");
});
33 changes: 32 additions & 1 deletion Sprint-3/2-practice-tdd/repeat.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,36 @@
function repeat() {
return "hellohellohello";
if (arguments[1] < 0) throw new Error("Count must be non-negative");
return arguments[0].repeat(arguments[1]);
}
//other implementation
// function repeat(str, count) {
// if (count < 0) {
// throw new Error("Count must be non-negative");
// }

// let result = "";
// for (let i = 0; i < count; i++) {
// result += str;
// }
// return result;
// }

// module.exports = repeat;

// function repeat() {
// const str = arguments[0];
// const count = arguments[1];

// if (count < 0) {
// throw new Error("Count must be non-negative");
// }

// let output = "";
// for (let i = 0; i < count; i++) {
// output += str;
// }

// return output;
// }

module.exports = repeat;
36 changes: 12 additions & 24 deletions Sprint-3/2-practice-tdd/repeat.test.js
Original file line number Diff line number Diff line change
@@ -1,32 +1,20 @@
// Implement a function repeat
const repeat = require("./repeat");
// Given a target string str and a positive integer count,
// When the repeat function is called with these inputs,
// Then it should:

// case: repeat String:
// Given a target string str and a positive integer count,
// When the repeat function is called with these inputs,
// Then it should repeat the str count times and return a new string containing the repeated str values.
const repeat = require("./repeat");

test("should repeat the string count times", () => {
const str = "hello";
const count = 3;
const repeatedStr = repeat(str, count);
expect(repeatedStr).toEqual("hellohellohello");
expect(repeat("hello", 3)).toEqual("hellohellohello");
});

test("should return the original string when count is 1", () => {
expect(repeat("hello", 1)).toEqual("hello");
});

// case: handle Count of 1:
// 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 return an empty string when count is 0", () => {
expect(repeat("hello", 0)).toEqual("");
});

// 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 throw an error when count is negative", () => {
expect(() => repeat("hello", -2)).toThrow("Count must be non-negative");
});

// 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.
Loading