From ce7c5af5a483309dcf3115267c3e446618058dce Mon Sep 17 00:00:00 2001 From: konjit Date: Tue, 28 Jan 2025 23:40:07 +0100 Subject: [PATCH 1/2] Solutions for Using APIs assignment week1 --- .test-summary/TEST_SUMMARY.md | 13 +++ 3-UsingAPIs/Week1/assignment/ex1-johnWho.js | 22 ++--- .../Week1/assignment/ex2-checkDoubleDigits.js | 20 ++++- 3-UsingAPIs/Week1/assignment/ex3-rollDie.js | 81 +++++++++---------- .../Week1/assignment/ex4-pokerDiceAll.js | 7 +- .../Week1/assignment/ex5-pokerDiceChain.js | 13 ++- .../Week1/test-reports/ex1-johnWho.report.txt | 21 +++++ .../ex2-checkDoubleDigits.report.txt | 23 ++++++ .../Week1/test-reports/ex3-rollDie.report.txt | 19 +++++ .../test-reports/ex4-pokerDiceAll.report.txt | 19 +++++ .../ex5-pokerDiceChain.report.txt | 17 ++++ 11 files changed, 197 insertions(+), 58 deletions(-) create mode 100644 .test-summary/TEST_SUMMARY.md create mode 100644 3-UsingAPIs/Week1/test-reports/ex1-johnWho.report.txt create mode 100644 3-UsingAPIs/Week1/test-reports/ex2-checkDoubleDigits.report.txt create mode 100644 3-UsingAPIs/Week1/test-reports/ex3-rollDie.report.txt create mode 100644 3-UsingAPIs/Week1/test-reports/ex4-pokerDiceAll.report.txt create mode 100644 3-UsingAPIs/Week1/test-reports/ex5-pokerDiceChain.report.txt diff --git a/.test-summary/TEST_SUMMARY.md b/.test-summary/TEST_SUMMARY.md new file mode 100644 index 000000000..7b91826ef --- /dev/null +++ b/.test-summary/TEST_SUMMARY.md @@ -0,0 +1,13 @@ +## Test Summary + +**Mentors**: For more information on how to review homework assignments, please refer to the [Review Guide](https://github.com/HackYourFuture/mentors/blob/main/assignment-support/review-guide.md). + +### 3-UsingAPIs - Week1 + +| Exercise | Passed | Failed | ESLint | +|-----------------------|--------|--------|--------| +| ex1-johnWho | 9 | - | ✕ | +| ex2-checkDoubleDigits | 11 | - | ✕ | +| ex3-rollDie | 7 | - | ✕ | +| ex4-pokerDiceAll | 7 | - | ✕ | +| ex5-pokerDiceChain | 5 | - | ✕ | diff --git a/3-UsingAPIs/Week1/assignment/ex1-johnWho.js b/3-UsingAPIs/Week1/assignment/ex1-johnWho.js index 5851c8c4f..0cbbc89f4 100644 --- a/3-UsingAPIs/Week1/assignment/ex1-johnWho.js +++ b/3-UsingAPIs/Week1/assignment/ex1-johnWho.js @@ -7,18 +7,18 @@ Rewrite this function, but replace the callback syntax with the Promise syntax: - If the Promise `rejects`, pass an error as the argument to reject with: "You didn't pass in a first name!" ------------------------------------------------------------------------------*/ -// TODO see above -export const getAnonName = (firstName, callback) => { - setTimeout(() => { - if (!firstName) { - callback(new Error("You didn't pass in a first name!")); - return; - } - const fullName = `${firstName} Doe`; - - callback(fullName); - }, 1000); +export const getAnonName = (firstName) => { + return new Promise((resolve, reject) => { + setTimeout(() => { + if (!firstName) { + reject(new Error("You didn't pass in a first name!")); + return; + } + const fullName = `${firstName} Doe`; + resolve(fullName); + }, 1000); + }); }; function main() { diff --git a/3-UsingAPIs/Week1/assignment/ex2-checkDoubleDigits.js b/3-UsingAPIs/Week1/assignment/ex2-checkDoubleDigits.js index 4b31d1927..fc3bbcf6e 100644 --- a/3-UsingAPIs/Week1/assignment/ex2-checkDoubleDigits.js +++ b/3-UsingAPIs/Week1/assignment/ex2-checkDoubleDigits.js @@ -11,10 +11,26 @@ Complete the function called `checkDoubleDigits` such that: "Expected a double digit number but got `number`", where `number` is the number that was passed as an argument. ------------------------------------------------------------------------------*/ -export function checkDoubleDigits(/* TODO add parameter(s) here */) { - // TODO complete this function + +export function checkDoubleDigits(number) { + return new Promise((resolve, reject) => { + if (is2Digit(number)) { + resolve('This is a double digit number!'); + } else { + reject(new Error(`Expected a double digit number but got ${number}`)); + } + }); } +const is2Digit = (number) => { + let count = 0; + while (number) { + number = Math.floor((number /= 10)); + count++; + } + return count === 2; +}; + function main() { checkDoubleDigits(9) // should reject .then((message) => console.log(message)) diff --git a/3-UsingAPIs/Week1/assignment/ex3-rollDie.js b/3-UsingAPIs/Week1/assignment/ex3-rollDie.js index 7e4b77888..9cd336b2e 100644 --- a/3-UsingAPIs/Week1/assignment/ex3-rollDie.js +++ b/3-UsingAPIs/Week1/assignment/ex3-rollDie.js @@ -1,57 +1,52 @@ /*------------------------------------------------------------------------------ Full description at: https://github.com/HackYourFuture/Assignments/tree/main/3-UsingAPIs/Week1#exercise-3-roll-a-die -- Run the unmodified program and confirm that problem described occurs. +- Run the unmodified program and confirm that the problem described occurs. - Refactor the `rollDie()` function from callback-based to returning a promise. -- Change the calls to `callback()` to calls to `resolve()` and `reject()`. +- Change the calls from `callback()` to calls to `resolve()` and `reject()`. - Refactor the code that call `rollDie()` to use the promise it returns. - Does the problem described above still occur? If not, what would be your explanation? Add your answer as a comment to be bottom of the file. ------------------------------------------------------------------------------*/ -// TODO Remove callback and return a promise -export function rollDie(callback) { - // Compute a random number of rolls (3-10) that the die MUST complete - const randomRollsToDo = Math.floor(Math.random() * 8) + 3; - console.log(`Die scheduled for ${randomRollsToDo} rolls...`); - - const rollOnce = (roll) => { - // Compute a random die value for the current roll - const value = Math.floor(Math.random() * 6) + 1; - console.log(`Die value is now: ${value}`); - - // Use callback to notify that the die rolled off the table after 6 rolls - if (roll > 6) { - // TODO replace "error" callback - callback(new Error('Oops... Die rolled off the table.')); - } - - // Use callback to communicate the final die value once finished rolling - if (roll === randomRollsToDo) { - // TODO replace "success" callback - callback(null, value); - } - - // Schedule the next roll todo until no more rolls to do - if (roll < randomRollsToDo) { - setTimeout(() => rollOnce(roll + 1), 500); - } - }; - - // Start the initial roll - rollOnce(1); +export function rollDie() { + return new Promise((resolve, reject) => { + const randomRollsToDo = Math.floor(Math.random() * 8) + 3; + console.log('Random', randomRollsToDo); + console.log(`Die scheduled for ${randomRollsToDo} rolls...`); + + const rollOnce = (roll) => { + const value = Math.floor(Math.random() * 6) + 1; + console.log(`Die value is now: ${value}`); + if (roll > 6) { + reject(new Error('Oops... Die rolled off the table.')); + return; + } + + if (roll === randomRollsToDo) { + resolve(value); + return; + } + if (roll < randomRollsToDo) { + setTimeout(() => rollOnce(roll + 1), 500); + } + }; + rollOnce(1); + }); } function main() { - // TODO Refactor to use promise - rollDie((error, value) => { - if (error !== null) { - console.log(error.message); - } else { + rollDie() + .then((value) => { console.log(`Success! Die settled on ${value}.`); - } - }); + }) + .catch((error) => { + console.log(error.message); + }) + .finally(() => { + console.log('Roll finished.'); + }); } // ! Do not change or remove the code below @@ -59,4 +54,8 @@ if (process.env.NODE_ENV !== 'test') { main(); } -// TODO Replace this comment by your explanation that was asked for in the assignment description. +// Explanation +// Using Promises resolves the issue of multiple callbacks after an error like +// new Error('Oops... Die rolled off the table.'). However, if randomRollsToDo > 6, +// the rolling continues unnecessarily even though the promise is already settled. +// To solve that we can use return after resolve or reject diff --git a/3-UsingAPIs/Week1/assignment/ex4-pokerDiceAll.js b/3-UsingAPIs/Week1/assignment/ex4-pokerDiceAll.js index d88cd71d2..33b831f93 100644 --- a/3-UsingAPIs/Week1/assignment/ex4-pokerDiceAll.js +++ b/3-UsingAPIs/Week1/assignment/ex4-pokerDiceAll.js @@ -27,9 +27,9 @@ exercise file. import { rollDie } from '../../helpers/pokerDiceRoller.js'; export function rollDice() { - // TODO Refactor this function const dice = [1, 2, 3, 4, 5]; - return rollDie(1); + const dicePromises = dice.map(() => rollDie()); + return Promise.all(dicePromises); } function main() { @@ -43,4 +43,5 @@ if (process.env.NODE_ENV !== 'test') { main(); } -// TODO Replace this comment by your explanation that was asked for in the assignment description. +// Each promise created are independent and does not know if an other promise is resolved and rejected +// And once a promise is created we cannot cancel it. diff --git a/3-UsingAPIs/Week1/assignment/ex5-pokerDiceChain.js b/3-UsingAPIs/Week1/assignment/ex5-pokerDiceChain.js index 5b1394b84..76a18aa45 100644 --- a/3-UsingAPIs/Week1/assignment/ex5-pokerDiceChain.js +++ b/3-UsingAPIs/Week1/assignment/ex5-pokerDiceChain.js @@ -17,12 +17,23 @@ import { rollDie } from '../../helpers/pokerDiceRoller.js'; export function rollDice() { const results = []; - // TODO: expand the chain to include five dice return rollDie(1) .then((value) => { results.push(value); return rollDie(2); }) + .then((value) => { + results.push(value); + return rollDie(3); + }) + .then((value) => { + results.push(value); + return rollDie(4); + }) + .then((value) => { + results.push(value); + return rollDie(5); + }) .then((value) => { results.push(value); return results; diff --git a/3-UsingAPIs/Week1/test-reports/ex1-johnWho.report.txt b/3-UsingAPIs/Week1/test-reports/ex1-johnWho.report.txt new file mode 100644 index 000000000..84a5c256e --- /dev/null +++ b/3-UsingAPIs/Week1/test-reports/ex1-johnWho.report.txt @@ -0,0 +1,21 @@ +*** Unit Test Error Report *** + + PASS .dist/3-UsingAPIs/Week1/unit-tests/ex1-johnWho.test.js + api-wk1-ex1-johnWho + ✅ should exist and be executable (2 ms) + ✅ should have all TODO comments removed (1 ms) + ✅ `getAnonName` should not contain unneeded console.log calls (1 ms) + ✅ should call `new Promise()` + ✅ should take a single argument + ✅ `resolve()` should be called with a one argument + ✅ `reject()` should be called with a one argument + ✅ should resolve when called with a string argument (2 ms) + ✅ should reject with an Error object when called without an argument (1 ms) + +Test Suites: 1 passed, 1 total +Tests: 9 passed, 9 total +Snapshots: 0 total +Time: 0.509 s, estimated 1 s +Ran all test suites matching /\/home\/konjit\/Desktop\/hmy\/Assignments-cohort51\/.dist\/3-UsingAPIs\/Week1\/unit-tests\/ex1-johnWho.test.js/i. +No linting errors detected. +No spelling errors detected. diff --git a/3-UsingAPIs/Week1/test-reports/ex2-checkDoubleDigits.report.txt b/3-UsingAPIs/Week1/test-reports/ex2-checkDoubleDigits.report.txt new file mode 100644 index 000000000..72766ebbc --- /dev/null +++ b/3-UsingAPIs/Week1/test-reports/ex2-checkDoubleDigits.report.txt @@ -0,0 +1,23 @@ +*** Unit Test Error Report *** + + PASS .dist/3-UsingAPIs/Week1/unit-tests/ex2-checkDoubleDigits.test.js + api-wk1-ex2-checkDoubleDigits + ✅ should exist and be executable (2 ms) + ✅ should have all TODO comments removed + ✅ `checkDoubleDigits` should not contain unneeded console.log calls (1 ms) + ✅ should call new Promise() + ✅ `resolve()` should be called with a one argument (1 ms) + ✅ `reject()` should be called with a one argument + ✅ should be a function that takes a single argument + ✅ (9) should return a rejected promise with an Error object (1 ms) + ✅ (10) should return a promise that resolves to "This is a double digit number!" (1 ms) + ✅ (99) should return a promise that resolves to "This is a double digit number!" (1 ms) + ✅ (100) should return a rejected promise with an Error object (1 ms) + +Test Suites: 1 passed, 1 total +Tests: 11 passed, 11 total +Snapshots: 0 total +Time: 0.742 s +Ran all test suites matching /\/home\/konjit\/Desktop\/hmy\/Assignments-cohort51\/.dist\/3-UsingAPIs\/Week1\/unit-tests\/ex2-checkDoubleDigits.test.js/i. +No linting errors detected. +No spelling errors detected. diff --git a/3-UsingAPIs/Week1/test-reports/ex3-rollDie.report.txt b/3-UsingAPIs/Week1/test-reports/ex3-rollDie.report.txt new file mode 100644 index 000000000..c815ec4d0 --- /dev/null +++ b/3-UsingAPIs/Week1/test-reports/ex3-rollDie.report.txt @@ -0,0 +1,19 @@ +*** Unit Test Error Report *** + + PASS .dist/3-UsingAPIs/Week1/unit-tests/ex3-rollDie.test.js + api-wk1-ex3-rollDie + ✅ should exist and be executable (2 ms) + ✅ should have all TODO comments removed + ✅ should call `new Promise()` (1 ms) + ✅ `resolve()` should be called with a one argument (1 ms) + ✅ `reject()` should be called with a one argument + ✅ should resolve when the die settles successfully (2 ms) + ✅ should reject with an Error when the die rolls off the table (1 ms) + +Test Suites: 1 passed, 1 total +Tests: 7 passed, 7 total +Snapshots: 0 total +Time: 0.523 s, estimated 6 s +Ran all test suites matching /\/home\/konjit\/Desktop\/hmy\/Assignments-cohort51\/.dist\/3-UsingAPIs\/Week1\/unit-tests\/ex3-rollDie.test.js/i. +No linting errors detected. +No spelling errors detected. diff --git a/3-UsingAPIs/Week1/test-reports/ex4-pokerDiceAll.report.txt b/3-UsingAPIs/Week1/test-reports/ex4-pokerDiceAll.report.txt new file mode 100644 index 000000000..799440887 --- /dev/null +++ b/3-UsingAPIs/Week1/test-reports/ex4-pokerDiceAll.report.txt @@ -0,0 +1,19 @@ +*** Unit Test Error Report *** + + PASS .dist/3-UsingAPIs/Week1/unit-tests/ex4-pokerDiceAll.test.js + api-wk1-ex4-pokerDiceAll + ✅ should exist and be executable (2 ms) + ✅ should have all TODO comments removed (1 ms) + ✅ `rollDice` should not contain unneeded console.log calls (1 ms) + ✅ should use `dice.map()` (1 ms) + ✅ should use `Promise.all()` + ✅ should resolve when all dice settle successfully (10 ms) + ✅ should reject with an Error when a die rolls off the table (29 ms) + +Test Suites: 1 passed, 1 total +Tests: 7 passed, 7 total +Snapshots: 0 total +Time: 0.797 s, estimated 1 s +Ran all test suites matching /\/home\/konjit\/Desktop\/hmy\/Assignments-cohort51\/.dist\/3-UsingAPIs\/Week1\/unit-tests\/ex4-pokerDiceAll.test.js/i. +No linting errors detected. +No spelling errors detected. diff --git a/3-UsingAPIs/Week1/test-reports/ex5-pokerDiceChain.report.txt b/3-UsingAPIs/Week1/test-reports/ex5-pokerDiceChain.report.txt new file mode 100644 index 000000000..7d58b17cb --- /dev/null +++ b/3-UsingAPIs/Week1/test-reports/ex5-pokerDiceChain.report.txt @@ -0,0 +1,17 @@ +*** Unit Test Error Report *** + + PASS .dist/3-UsingAPIs/Week1/unit-tests/ex5-pokerDiceChain.test.js + api-wk1-ex5-pokerDiceChain + ✅ should exist and be executable (2 ms) + ✅ should have all TODO comments removed + ✅ `rollDice` should not contain unneeded console.log calls (1 ms) + ✅ should resolve when all dice settle successfully (18 ms) + ✅ should reject with an Error when a die rolls off the table (30 ms) + +Test Suites: 1 passed, 1 total +Tests: 5 passed, 5 total +Snapshots: 0 total +Time: 0.697 s, estimated 1 s +Ran all test suites matching /\/home\/konjit\/Desktop\/hmy\/Assignments-cohort51\/.dist\/3-UsingAPIs\/Week1\/unit-tests\/ex5-pokerDiceChain.test.js/i. +No linting errors detected. +No spelling errors detected. From ef4a18283b5c86e8db242953293d3c2ab5bc5004 Mon Sep 17 00:00:00 2001 From: konjit Date: Wed, 29 Jan 2025 18:34:13 +0100 Subject: [PATCH 2/2] Update ex2-checkDoubleDigits.js Made the `is2Digit` function more readable. --- 3-UsingAPIs/Week1/assignment/ex2-checkDoubleDigits.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/3-UsingAPIs/Week1/assignment/ex2-checkDoubleDigits.js b/3-UsingAPIs/Week1/assignment/ex2-checkDoubleDigits.js index fc3bbcf6e..5ad0b3fbb 100644 --- a/3-UsingAPIs/Week1/assignment/ex2-checkDoubleDigits.js +++ b/3-UsingAPIs/Week1/assignment/ex2-checkDoubleDigits.js @@ -22,14 +22,7 @@ export function checkDoubleDigits(number) { }); } -const is2Digit = (number) => { - let count = 0; - while (number) { - number = Math.floor((number /= 10)); - count++; - } - return count === 2; -}; +const is2Digit = (num) => num >= 10 && num <= 99; function main() { checkDoubleDigits(9) // should reject