Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,18 @@
// execute the code to ensure all tests pass.

function getAngleType(angle) {
// TODO: Implement this function
if (angle < 0 || angle >= 360) return "Invalid angle";
if (angle < 90) return "Acute angle";
if (angle === 90) return "Right angle";
if (angle > 90 && angle < 180) return "Obtuse angle";
if (angle === 180) return "Straight angle";
return "Reflex angle";
}

// The line below allows us to load the getAngleType function into tests in other files.
// This will be useful in the "rewrite tests with jest" step.
module.exports = getAngleType;

module.exports = getAngleType;
// This helper function is written to make our assertions easier to read.
// If the actual output matches the target output, the test will pass
function assertEquals(actualOutput, targetOutput) {
Expand All @@ -31,7 +36,31 @@ function assertEquals(actualOutput, targetOutput) {
);
}

// TODO: Write tests to cover all cases, including boundary and invalid cases.
// Example: Identify Right Angles
const right = getAngleType(90);
assertEquals(right, "Right angle");

const acute = getAngleType(45);
assertEquals(acute, "Acute angle");

const obtuse = getAngleType(120);
assertEquals(obtuse, "Obtuse angle");

const straight = getAngleType(180);
assertEquals(straight, "Straight angle");

const reflex = getAngleType(270);
assertEquals(reflex, "Reflex angle");

const invalid = getAngleType(-10);
assertEquals(invalid, "Invalid angle");

const invalid2 = getAngleType(360);
assertEquals(invalid2, "Invalid angle");

console.log(getAngleType(20));
console.log(getAngleType(90));
console.log(getAngleType(120));
console.log(getAngleType(180));
console.log(getAngleType(270));
console.log(getAngleType(-10));
console.log(getAngleType(360));
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
// execute the code to ensure all tests pass.

function isProperFraction(numerator, denominator) {
// TODO: Implement this function
if (denominator === 0) return false; // A fraction with a zero denominator is not valid
if (Math.abs(numerator) >= Math.abs(denominator)) return false; // Not a proper fraction
return true; // Is a proper fraction
}

// The line below allows us to load the isProperFraction function into tests in other files.
Expand All @@ -31,3 +33,15 @@ function assertEquals(actualOutput, targetOutput) {

// Example: 1/2 is a proper fraction
assertEquals(isProperFraction(1, 2), true);
assertEquals(isProperFraction(2, 2), false);
assertEquals(isProperFraction(2, 1), false);
assertEquals(isProperFraction(0, 2), true);
assertEquals(isProperFraction(1, 0), false);
assertEquals(isProperFraction(0, 0), false);

console.log(isProperFraction(1, 2));
console.log(isProperFraction(2, 2));
console.log(isProperFraction(2, 1));
console.log(isProperFraction(0, 2));
console.log(isProperFraction(1, 0));
console.log(isProperFraction(0, 0));
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,40 @@
// execute the code to ensure all tests pass.

function getCardValue(card) {
// TODO: Implement this function
}
if (typeof card !== "string" || card.length < 2) {
throw new Error("Invalid card");
}
// Handle "10" which is like "10♥"
if (card.startsWith("10")) {
return 10;
}
//if more than 2 characters and not starting with a 10 card
if (card.length > 2) {
throw new Error("Invalid card");
}

// remaining cards must be 2 characters long

const validSuits = ["♠", "♥", "♦", "♣"];
const suit = card[card.length - 1];

const firstChar = card[0];

// check if picture cards
if (firstChar === "A") return 11;
if (firstChar === "J" || firstChar === "Q" || firstChar === "K") return 10;

// check if number is between 2 and 9, 10 has already been checked for and there should be no other valid cards

const num = Number(firstChar);

if (!isNaN(num) && num >= 2 && num <= 9) {
return num;
// for everything else
} else {
throw new Error("Invalid card");
}
}
// The line below allows us to load the getCardValue function into tests in other files.
// This will be useful in the "rewrite tests with jest" step.
module.exports = getCardValue;
Expand All @@ -40,13 +71,52 @@ function assertEquals(actualOutput, targetOutput) {
// TODO: Write tests to cover all outcomes, including throwing errors for invalid cards.
// Examples:
assertEquals(getCardValue("9♠"), 9);
assertEquals(getCardValue("10♥"), 10);
assertEquals(getCardValue("J♥"), 10);
assertEquals(getCardValue("A♠"), 11);
assertEquals(getCardValue("Q♦"), 10);
assertEquals(getCardValue("K♣"), 10);

// Handling invalid cards
try {
getCardValue("♠J");
console.error("Error was not thrown for invalid card");
} catch (e) {}

try {
getCardValue("invalid");
console.error("Error was not thrown for invalid card");
} catch (e) {}

try {
getCardValue("22");
console.error("Error was not thrown for invalid card");
} catch (e) {}

// This line will not be reached if an error is thrown as expected
console.log(getCardValue("9♠"));
console.log(getCardValue("10♥"));
console.log(getCardValue("J♥"));
console.log(getCardValue("A♠"));
console.log(getCardValue("Q♦"));
console.log(getCardValue("K♣"));

// This line will not be reached if an error is thrown as expected
try {
console.error("Error was not thrown for invalid card");
} catch (e) {}

// What other invalid card cases can you think of?

// There could be cards with special characters.

// There could be cards with two numbers rather than a number and a suite
// These will not be picked up because the code only checks for if starts with 10 or if the first character
// is a number between 2 and 9, so cards like "22" would be valid because the first number
// is 2, but the second character is not checked for validity. It is also 2 characters
// so will not cause an error when the length is checked.

// Since the second character is not checked it could be 2D which is not a valid card but
// would be accepted because the first character is 2 and the second character is not checked for validity

// When the card is checked if it begins with 10 it does check if it has a valid suite
// as only the first 2 characters are checked so it could be 10DEVON or 10♥♥.
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,48 @@
// We will use the same function, but write tests for it using Jest in this file.
const getAngleType = require("../implement/1-get-angle-type");

// TODO: Write tests in Jest syntax to cover all cases/outcomes,
// including boundary and invalid cases.

// Case 1: Acute angles
test(`should return "Acute angle" when (0 < angle < 90)`, () => {
// Test various acute angles, including boundary cases
expect(getAngleType(1)).toEqual("Acute angle");
expect(getAngleType(45)).toEqual("Acute angle");
expect(getAngleType(89)).toEqual("Acute angle");
expect(getAngleType(91)).toEqual("Obtuse angle");
});

// Case 2: Right angle
test(`should return "Right angle" when (angle === 90)`, () => {
// Test various right angles, including boundary cases
expect(getAngleType(90)).toEqual("Right angle");
expect(getAngleType(89)).toEqual("Acute angle");
expect(getAngleType(91)).toEqual("Obtuse angle");
});

// Case 3: Obtuse angles
test(`should return "Obtuse angle" when (angle > 90) && when (angle < 180)`, () => {
// Test various obtuse angles, including boundary cases
expect(getAngleType(91)).toEqual("Obtuse angle");
expect(getAngleType(150)).toEqual("Obtuse angle");
expect(getAngleType(189)).toEqual("Reflex angle");
});

// Case 4: Straight angle
test(`should return "Straight angle" when (angle === 180)`, () => {
// Test various straight angles, including boundary cases
expect(getAngleType(180)).toEqual("Straight angle");
expect(getAngleType(179)).toEqual("Obtuse angle");
expect(getAngleType(181)).toEqual("Reflex angle");
});

// Case 5: Reflex angles
test(`should return "Reflex angle" when (angle > 180)`, () => {
expect(getAngleType(181)).toEqual("Reflex angle");
expect(getAngleType(270)).toEqual("Reflex angle");
expect(getAngleType(359)).toEqual("Reflex angle");
});

// Case 6: Invalid angles
test(`should return "Invalid angle" when (angle < 0 || angle >= 360)`, () => {
expect(getAngleType(-1)).toEqual("Invalid angle");
expect(getAngleType(360)).toEqual("Invalid angle");
});
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,27 @@
// We will use the same function, but write tests for it using Jest in this file.
const isProperFraction = require("../implement/2-is-proper-fraction");

// TODO: Write tests in Jest syntax to cover all combinations of positives, negatives, zeros, and other categories.

// Special case: numerator is zero
test(`should return false when denominator is zero`, () => {
expect(isProperFraction(1, 0)).toEqual(false);
});

test(`should return false when denominator is zero`, () => {
expect(isProperFraction(1, 2)).toEqual(true);
});

test(`should return false when denominator is zero`, () => {
expect(isProperFraction(2, 2)).toEqual(false);
});

test(`should return false when denominator is zero`, () => {
expect(isProperFraction(2, 1)).toEqual(false);
});

test(`should return false when denominator is zero`, () => {
expect(isProperFraction(0, 0)).toEqual(false);
});

test(`should return false when denominator is zero`, () => {
expect(isProperFraction(0, 1)).toEqual(true);
});
Original file line number Diff line number Diff line change
@@ -1,20 +1,54 @@
// This statement loads the getCardValue function you wrote in the implement directory.
// We will use the same function, but write tests for it using Jest in this file.
const { createTestScheduler } = require("jest");
const getCardValue = require("../implement/3-get-card-value");

// TODO: Write tests in Jest syntax to cover all possible outcomes.

// Case 1: Ace (A)
test(`Should return 11 when given an ace card`, () => {
expect(getCardValue("A♠")).toEqual(11);
});

// Suggestion: Group the remaining test data into these categories:
// Number Cards (2-10)
// Face Cards (J, Q, K)
// Invalid Cards
// Case 2: Face Cards (J, Q, K)
test(`Should return 10 when given a Jack card`, () => {
expect(getCardValue("J♥")).toEqual(10);
});

// To learn how to test whether a function throws an error as expected in Jest,
// please refer to the Jest documentation:
// https://jestjs.io/docs/expect#tothrowerror
test(`Should return 10 when given a Queen card`, () => {
expect(getCardValue("Q♦")).toEqual(10);
});

test(`Should return 10 when given a King card`, () => {
expect(getCardValue("K♣")).toEqual(10);
});

// Case 3: Number Cards (2-10)
test(`Should return 2 when given a 2 card`, () => {
expect(getCardValue("2♠")).toEqual(2);
});

test(`Should return 10 when given a 10 card`, () => {
expect(getCardValue("10♥")).toEqual(10);
});

// Case 4: Invalid Cards
test(`Should throw an error when given an invalid card`, () => {
expect(() => getCardValue("♠J")).toThrow();
});

test(`Should throw an error when given an invalid card`, () => {
expect(() => getCardValue("invalid")).toThrow();
});

test(`Should throw an error when given an invalid card`, () => {
expect(() => getCardValue("12♠")).toThrow();
});

test(`Should throw an error when given an invalid card`, () => {
expect(() => getCardValue("1")).toThrow();
});

// when I tested with test(`Should throw an error when given an invalid card`, () => {
// expect(() => getCardValue("22")).toThrow(); it did not throw an error because 22 passes the
// test of first number between and 9 and being 2 characters long,
// but it is not a valid card because the second character is not a valid suite.
// The second character is not checked.
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;
39 changes: 39 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,42 @@ 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 multiple occurrences of a character", () => {
const str = "blind";
const char = "a";
const count = countChar(str, char);
expect(count).toEqual(0);
});

test("should count multiple occurrences of a character", () => {
const str = "blood";
const char = "o";
const count = countChar(str, char);
expect(count).toEqual(2);
});

test("should count multiple occurrences of a character", () => {
const str = "blood";
const char = "l";
const count = countChar(str, char);
expect(count).toEqual(1);
});

test("should count multiple occurrences of a character", () => {
const str = "bbbrf";
const char = "b";
const count = countChar(str, char);
expect(count).toEqual(3);
});

test("should count multiple occurrences of a character", () => {
const str = "ooooa";
const char = "o";
const count = countChar(str, char);
expect(count).toEqual(4);
});

//handling invalid input
//the tests work assuming that only letters are in the string
// numbers or special characters are not tested for
Loading