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

function getAngleType(angle) {
if (angle > 0 && angle < 90) {
return "Acute angle";
} else if (angle === 90) {
return "Right angle";
} else if (angle > 90 && angle < 180) {
return "Obtuse angle";
} else if (angle === 180) {
return "Straight angle";
} else if (angle > 180 && angle < 360) {
return "Reflex angle";
} else {
return "Invalid angle";
}

// TODO: Implement this function
}

Expand All @@ -33,5 +47,33 @@ 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 right = getAngleType(90);
// assertEquals(right, "Right angle");
assertEquals(getAngleType(90), "Right angle");

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

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

// const stright = getAngleType(180);
// assertEquals(stright, "Stright angle");
assertEquals(getAngleType(180), "Stright angle");
// const reflex = getAngleType(270);
// assertEquals(reflex, "Reflex angle");
assertEquals(getAngleType(270), "Reflex angle");

// const invalid = getAngleType(360);
// assertEquals(invalid, "Invalid angle");
assertEquals(getAngleType(360), "Invalid angle");
//Boundary cases
// const invalid = getAngleType(0);
// assertEquals(invalid, "Invalid angle");
assertEquals(getAngleType(0), "Invalid angle");
//Outside range
// const invalid = getAngleType(-10 , 400);
// assertEquals(invalid, "Invalid angle");
assertEquals(getAngleType(-10, 400), "Invalid angle");
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,12 @@
// execute the code to ensure all tests pass.

function isProperFraction(numerator, denominator) {
// TODO: Implement this function
if (denominator <= 0) return false;
if (numerator < 0) return false;

return numerator < denominator;
}
// TODO: Implement this function

// The line below allows us to load the isProperFraction function into tests in other files.
// This will be useful in the "rewrite tests with jest" step.
Expand All @@ -22,7 +26,7 @@ module.exports = isProperFraction;
function assertEquals(actualOutput, targetOutput) {
console.assert(
actualOutput === targetOutput,
`Expected ${actualOutput} to equal ${targetOutput}`
`Expected ${actualOutput} toBe ${targetOutput}`
);
}

Expand All @@ -31,3 +35,20 @@ function assertEquals(actualOutput, targetOutput) {

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

// equal numbers
assertEquals(isProperFraction(4, 4), false);

// negative numbers
assertEquals(isProperFraction(-2, 4), true);
assertEquals(isProperFraction(5, -4), false);
assertEquals(isProperFraction(-3, -5), false);
assertEquals(isProperFraction(-1, 2), true);
assertEquals(isProperFraction(-1, 2), true);

// special case
assertEquals(isProperFraction(1, 0), false);

assertEquals(isProperFraction(0, 5), true);
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,40 @@
// execute the code to ensure all tests pass.

function getCardValue(card) {
// TODO: Implement this function
const suit = card.slice(-1);
const rank = card.slice(0, -1);

const validSuits = ["♠", "♥", "♦", "♣"];
if (!validSuits.includes(suit)) {
throw new Error("Invalid card");
}

const validRanks = [
"A",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"J",
"Q",
"K",
];

if (!validRanks.includes(rank)) {
throw new Error("Invalid card");
}

if (rank === "A") return 11;
if (rank === "J" || rank === "Q" || rank === "K") return 10;

return Number(rank);
}
// TODO: Implement this function

// 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.
Expand All @@ -40,6 +72,16 @@ function assertEquals(actualOutput, targetOutput) {
// TODO: Write tests to cover all outcomes, including throwing errors for invalid cards.
// Examples:
assertEquals(getCardValue("9♠"), 9);
assertEquals(getCardValue("2♠"), 2);
assertEquals(getCardValue("10♦"), 10);

// Face cards
assertEquals(getCardValue("J♣"), 10);
assertEquals(getCardValue("Q♥"), 10);
assertEquals(getCardValue("K♦"), 10);

// Ace
assertEquals(getCardValue("A♠"), 11);

// Handling invalid cards
try {
Expand All @@ -50,3 +92,13 @@ try {
} catch (e) {}

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

const invalidCards = ["invalid", "1♠", "B♣", "10?", "Z♠"];
for (const card of invalidCards) {
try {
getCardValue(card);
console.error(`Error was not thrown for invalid card: ${card}`);
} catch (e) {
// Expected error, do nothing
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,55 @@ const getAngleType = require("../implement/1-get-angle-type");
// 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");
describe("Acute angle", () => {
test("valid acute angles", () => {
expect(getAngleType(1)).toBe("Acute angle");
expect(getAngleType(45)).toBe("Acute angle");
expect(getAngleType(89)).toBe("Acute angle");
});

test("boundary cases are NOT acute", () => {
expect(getAngleType(0)).not.toBe("Acute angle");
expect(getAngleType(90)).not.toBe("Acute angle");
});
});

// Case 2: Right angle
describe("Right angle", () => {
test("should return 'Right angle' when angle is 90", () => {
expect(getAngleType(90)).toBe("Right angle");
});
});

// Case 3: Obtuse angles
describe("Obtuse angle", () => {
test("should return 'Obtuse angle' when (90 < angle < 180)", () => {
expect(getAngleType(95)).toBe("Obtuse angle");
expect(getAngleType(120)).toBe("Obtuse angle");
expect(getAngleType(100)).toBe("Obtuse angle");
});
});

// Case 4: Straight angle
describe("Straight angle", () => {
test("should return 'Straight angle' when angle is 180", () => {
expect(getAngleType(180)).toBe("Straight angle");
});
});
// Case 5: Reflex angles
describe("Reflex angle", () => {
test("should return 'Reflex angle' when (180 < angle < 360)", () => {
expect(getAngleType(190)).toBe("Reflex angle");
expect(getAngleType(300)).toBe("Reflex angle");
expect(getAngleType(200)).toBe("Reflex angle");
});
});
// Case 6: Invalid angles
describe("Invalid angle", () => {
test("should return 'Invalid angle' when (angle <= 0 or angle > 360)", () => {
expect(getAngleType(0)).toBe("Invalid angle");
expect(getAngleType(400)).toBe("Invalid angle");
expect(getAngleType(-10)).toBe("Invalid angle");
expect(getAngleType(360)).toBe("Invalid angle");
});
});
Comment on lines +53 to +60
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.

  • 360 is also an invalid angle. The test description could include it too.

  • Why not test both boundary cases?

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.

I added the boundary cases

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.

You didn't update the test description.

Original file line number Diff line number Diff line change
@@ -1,10 +1,41 @@
// This statement loads the isProperFraction function you wrote in the implement directory.
// 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.
// denominator is zero
test("should return false when denominator is zero", () => {
expect(isProperFraction(1, 0)).toBe(false);
});

// proper fraction
test("should return true when numerator < denominator", () => {
expect(isProperFraction(1, 2)).toBe(true);
});

// improper fraction
test("should return false when numerator > denominator", () => {
expect(isProperFraction(5, 3)).toBe(false);
});

// equal numbers
test("should return false when numerator === denominator", () => {
expect(isProperFraction(4, 4)).toBe(false);
});

// numerator is zero
test("should return true when numerator is zero and denominator is positive", () => {
expect(isProperFraction(0, 5)).toBe(true);
});

// negative numerator
test("should return false when numerator is negative", () => {
expect(isProperFraction(-2, 4)).toBe(false);
});

// negative denominator
test("should return false when denominator is negative", () => {
expect(isProperFraction(5, -4)).toBe(false);
});

// Special case: numerator is zero
test(`should return false when denominator is zero`, () => {
expect(isProperFraction(1, 0)).toEqual(false);
// both negative
test("should return false when both numerator and denominator are negative", () => {
expect(isProperFraction(-3, -5)).toBe(false);
});
Comment on lines +29 to +41
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.

Can your function pass all these tests?

We can use pseudo-code and notations like abs(...) or | ... | in the test descriptions to more
concisely describe the conditions (the "when" part).

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.

I fixed the function to pass all the tests

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.

This file should contain the tests for getCardValue().

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.

done

Original file line number Diff line number Diff line change
@@ -1,20 +1,46 @@
// 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 getCardValue = require("../implement/3-get-card-value");

// TODO: Write tests in Jest syntax to cover all possible outcomes.
// Ace
test("Should return 11 when given an ace card", () => {
expect(getCardValue("A♠")).toBe(11);
});

// Number cards
test("Should return the numeric value for number cards", () => {
expect(getCardValue("2♠")).toBe(2);
expect(getCardValue("5♥")).toBe(5);
expect(getCardValue("9♦")).toBe(9);
expect(getCardValue("10♣")).toBe(10);
});

// Case 1: Ace (A)
test(`Should return 11 when given an ace card`, () => {
expect(getCardValue("A♠")).toEqual(11);
// Face cards
test("Should return 10 for face cards", () => {
expect(getCardValue("J♠")).toBe(10);
expect(getCardValue("Q♥")).toBe(10);
expect(getCardValue("K♦")).toBe(10);
});

// Suggestion: Group the remaining test data into these categories:
// Number Cards (2-10)
// Face Cards (J, Q, K)
// Invalid Cards
// Invalid cards (basic)
test("Should throw error for invalid cards", () => {
expect(() => getCardValue("1♠")).toThrow();
expect(() => getCardValue("B♣")).toThrow();
expect(() => getCardValue("10?")).toThrow();
expect(() => getCardValue("invalid")).toThrow();
});

// 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
// Invalid numeric formats (IMPORTANT for your strict function)
test("Should throw error for malformed numeric ranks", () => {
expect(() => getCardValue("0x02♠")).toThrow();
expect(() => getCardValue("2.1♠")).toThrow();
expect(() => getCardValue("0002♠")).toThrow();
});

// Invalid structure cases
test("Should throw error for malformed card structure", () => {
expect(() => getCardValue("")).toThrow();
expect(() => getCardValue("♠")).toThrow();
expect(() => getCardValue("10")).toThrow();
expect(() => getCardValue("A♠♠")).toThrow();
expect(() => getCardValue(" 2♠")).toThrow();
expect(() => getCardValue("2♠ ")).toThrow();
});
Loading