From 515e3a3d02519030ae736de375d56742a883ead8 Mon Sep 17 00:00:00 2001 From: Hadidreem17 Date: Wed, 3 Sep 2025 23:35:15 +0200 Subject: [PATCH] submit week3 assignment --- .test-summary/TEST_SUMMARY.md | 10 +++ .../Week3/assignment/ex1-doubleEvenNumbers.js | 13 ++++ .../assignment/ex1-doubleEvenNumbers.test.js | 8 +-- .../Week3/assignment/ex2-mondaysWorth.js | 23 ++++++ .../Week3/assignment/ex3-lemonAllergy.js | 36 ++++++++++ .../Week3/assignment/ex4-observable.js | 50 +++++++++++++ .../ex4-observable/ex4-observable.js | 31 ++++---- 1-JavaScript/Week3/assignment/ex5-wallet.js | 70 +++++++++++++++++++ .../ex1-doubleEvenNumbers.test.report.txt | 13 ++++ .../test-reports/ex4-observable.report.txt | 15 ++++ 10 files changed, 243 insertions(+), 26 deletions(-) create mode 100644 .test-summary/TEST_SUMMARY.md create mode 100644 1-JavaScript/Week3/assignment/ex1-doubleEvenNumbers.js create mode 100644 1-JavaScript/Week3/assignment/ex2-mondaysWorth.js create mode 100644 1-JavaScript/Week3/assignment/ex3-lemonAllergy.js create mode 100644 1-JavaScript/Week3/assignment/ex4-observable.js create mode 100644 1-JavaScript/Week3/assignment/ex5-wallet.js create mode 100644 1-JavaScript/Week3/test-reports/ex1-doubleEvenNumbers.test.report.txt create mode 100644 1-JavaScript/Week3/test-reports/ex4-observable.report.txt diff --git a/.test-summary/TEST_SUMMARY.md b/.test-summary/TEST_SUMMARY.md new file mode 100644 index 000000000..c35301947 --- /dev/null +++ b/.test-summary/TEST_SUMMARY.md @@ -0,0 +1,10 @@ +## 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). + +### 1-JavaScript - Week3 + +| Exercise | Passed | Failed | ESLint | +|----------------------------|--------|--------|--------| +| ex1-doubleEvenNumbers.test | 1 | - | ✓ | +| ex4-observable | 3 | - | ✓ | diff --git a/1-JavaScript/Week3/assignment/ex1-doubleEvenNumbers.js b/1-JavaScript/Week3/assignment/ex1-doubleEvenNumbers.js new file mode 100644 index 000000000..f9f4c0c21 --- /dev/null +++ b/1-JavaScript/Week3/assignment/ex1-doubleEvenNumbers.js @@ -0,0 +1,13 @@ +function doubleEvenNumbers(numbers) { + // TODO rewrite the function body using `map` and `filter`. + return numbers.filter(n => n % 2 === 0).map(n => n * 2); +} +module.exports = doubleEvenNumbers; +// ! Unit test (using Jest) +describe('js-wk3-ex1-doubleEvenNumbers', () => { + test('doubleEvenNumbers should take the even numbers and double them', () => { + const actual = doubleEvenNumbers([1, 2, 3, 4]); + const expected = [4, 8]; + expect(actual).toEqual(expected); + }); +}); diff --git a/1-JavaScript/Week3/assignment/ex1-doubleEvenNumbers.test.js b/1-JavaScript/Week3/assignment/ex1-doubleEvenNumbers.test.js index ff706f8db..72bcce579 100644 --- a/1-JavaScript/Week3/assignment/ex1-doubleEvenNumbers.test.js +++ b/1-JavaScript/Week3/assignment/ex1-doubleEvenNumbers.test.js @@ -12,13 +12,7 @@ Let's rewrite it (or _refactor_ it, as experienced developers would call it): // ! Function to be tested function doubleEvenNumbers(numbers) { // TODO rewrite the function body using `map` and `filter`. - const newNumbers = []; - for (let i = 0; i < numbers.length; i++) { - if (numbers[i] % 2 === 0) { - newNumbers.push(numbers[i] * 2); - } - } - return newNumbers; + return numbers.filter(n => n % 2 === 0).map(n => n * 2); } // ! Unit test (using Jest) diff --git a/1-JavaScript/Week3/assignment/ex2-mondaysWorth.js b/1-JavaScript/Week3/assignment/ex2-mondaysWorth.js new file mode 100644 index 000000000..1456b6bfb --- /dev/null +++ b/1-JavaScript/Week3/assignment/ex2-mondaysWorth.js @@ -0,0 +1,23 @@ +const eurosFormatter = new Intl.NumberFormat('nl-NL', { + style: 'currency', + currency: 'EUR', +}); + +/** + * @param {Array<{duration:number}>} tasks + * @param {number} hourlyRate + * @returns {string} + */ +function computeEarnings(tasks, hourlyRate) { + const totalMinutes = Array.isArray(tasks) + ? tasks.reduce((sum, t) => sum + (Number(t?.duration) || 0), 0) + : 0; + + const totalHours = totalMinutes / 60; + const earnings = totalHours * Number(hourlyRate || 0); + + return eurosFormatter.format(earnings); +} + +module.exports = computeEarnings; + diff --git a/1-JavaScript/Week3/assignment/ex3-lemonAllergy.js b/1-JavaScript/Week3/assignment/ex3-lemonAllergy.js new file mode 100644 index 000000000..d3d6ba6db --- /dev/null +++ b/1-JavaScript/Week3/assignment/ex3-lemonAllergy.js @@ -0,0 +1,36 @@ +const sanitizeFruitBasket = require('./ex3-lemonAllergy'); + +describe('js-wk3-ex3-lemonAllergy', () => { + const fruitBasket = ['apple', 'banana', 'lemon', 'pear']; + const originalFruitBasketContents = [...fruitBasket]; + + test('sanitizeFruitBasket should take two parameters', () => { + expect(sanitizeFruitBasket.length === 2).toBe(true); + }); + + test('sanitizeFruitBasket should not modify the original fruitBasket array', () => { + sanitizeFruitBasket(fruitBasket, 'lemon'); + const sameContent = + fruitBasket.length === originalFruitBasketContents.length && + fruitBasket.every((x, i) => x === originalFruitBasketContents[i]); + expect(sameContent).toBe(true); + }); + + test('sanitizeFruitBasket should return a new array that does not include the unwanted "lemon"', () => { + const result = sanitizeFruitBasket(fruitBasket, 'lemon'); + const hasNoLemon = !result + .map(x => String(x).toLowerCase().trim()) + .includes('lemon'); + expect(hasNoLemon).toBe(true); + }); +}); + + + + + + + + + + diff --git a/1-JavaScript/Week3/assignment/ex4-observable.js b/1-JavaScript/Week3/assignment/ex4-observable.js new file mode 100644 index 000000000..d768ba2d1 --- /dev/null +++ b/1-JavaScript/Week3/assignment/ex4-observable.js @@ -0,0 +1,50 @@ +function createObservable() { + const subscribers = new Set(); + + function subscribe(listener) { + if (typeof listener !== "function") { + return { unsubscribe() {} }; + } + subscribers.add(listener); + + return { + unsubscribe() { + subscribers.delete(listener); + }, + }; + } + + function notify(message) { + // snapshot not needed with Set iteration, but this is fine + subscribers.forEach((fn) => fn(message)); + } + + return { subscribe, notify }; +} + +module.exports = createObservable; +function createObservable() { + const subscribers = []; + + function subscribe(listener) { + subscribers.push(listener); + return { + unsubscribe() { + const index = subscribers.indexOf(listener); + if (index !== -1) { + subscribers.splice(index, 1); + } + }, + }; + } + + function notify(message) { + for (const listener of subscribers) { + listener(message); + } + } + + return { subscribe, notify }; +} + +module.exports = createObservable; diff --git a/1-JavaScript/Week3/assignment/ex4-observable/ex4-observable.js b/1-JavaScript/Week3/assignment/ex4-observable/ex4-observable.js index a729822bc..ae091bc11 100644 --- a/1-JavaScript/Week3/assignment/ex4-observable/ex4-observable.js +++ b/1-JavaScript/Week3/assignment/ex4-observable/ex4-observable.js @@ -1,25 +1,18 @@ -/*------------------------------------------------------------------------------ -Full description at: https://github.com/HackYourFuture/Assignments/tree/main/1-JavaScript/Week4#exercise-4-observable - -Complete the `createObservable()` function as follows: +function createObservable() { + const subscribers = []; -- The `subscribe` function should take the function passed to it as an argument - and push it onto the `subscribers` array. (Yes, you can store functions in an - array. Functions are treated in JavaScript like any other value. + function subscribe(listener) { + subscribers.push(listener); + } -- The `notify` function should iterate through, and call, all subscribers from - the `subscribers` array, passing on the notification message to each - subscriber. -------------------------------------------------------------------------------*/ + function notify(message) { + subscribers.forEach(listener => listener(message)); + } -export function createObservable() { - const subscribers = []; return { - subscribe(subscriber) { - // TODO complete this function - }, - notify(message) { - // TODO complete this function - }, + subscribe, + notify }; } + +module.exports = { createObservable }; diff --git a/1-JavaScript/Week3/assignment/ex5-wallet.js b/1-JavaScript/Week3/assignment/ex5-wallet.js new file mode 100644 index 000000000..b20496043 --- /dev/null +++ b/1-JavaScript/Week3/assignment/ex5-wallet.js @@ -0,0 +1,70 @@ +const eurosFormatter = new Intl.NumberFormat('nl-NL', { + style: 'currency', + currency: 'EUR', +}); + +function createWallet(name, cash = 0) { + function deposit(amount) { + cash += amount; + } + + function withdraw(amount) { + if (cash - amount < 0) { + console.log(`Insufficient funds!`); + return 0; + } + + cash -= amount; + return amount; + } + + function transferInto(wallet, amount) { + console.log( + `Transferring ${eurosFormatter.format(amount)} from ${name} to ${wallet.getName()}` + ); + const withdrawnAmount = withdraw(amount); + wallet.deposit(withdrawnAmount); + } + + function reportBalance() { + console.log(`Name: ${name}, balance: ${eurosFormatter.format(cash)}`); + } + + const getName = () => name; + + return { + deposit, + withdraw, + transferInto, + reportBalance, + getName, + }; +} + +const walletJack = createWallet('Jack', 100); +const walletJoe = createWallet('Joe', 10); +const walletJane = createWallet('Jane', 20); + +walletJack.transferInto(walletJoe, 50); +walletJane.transferInto(walletJoe, 25); + +walletJane.deposit(20); +walletJane.transferInto(walletJoe, 25); + +walletJack.reportBalance(); +walletJoe.reportBalance(); +walletJane.reportBalance(); + +// * End of exercise code + +/*******************************************************************************/ + +// prettier-ignore +// eslint-disable-next-line no-unused-vars +const quiz = { + q1: { answer: 'b' }, + q2: { answer: 'c' }, + q3: { answer: 'a' }, + q4: { answer: 'b' }, + q5: { answer: 'c' }, +}; diff --git a/1-JavaScript/Week3/test-reports/ex1-doubleEvenNumbers.test.report.txt b/1-JavaScript/Week3/test-reports/ex1-doubleEvenNumbers.test.report.txt new file mode 100644 index 000000000..1a667bb54 --- /dev/null +++ b/1-JavaScript/Week3/test-reports/ex1-doubleEvenNumbers.test.report.txt @@ -0,0 +1,13 @@ +*** Unit Test Error Report *** + + PASS 1-JavaScript/Week3/assignment/ex1-doubleEvenNumbers.test.js + js-wk3-ex1-doubleEvenNumbers + ✅ doubleEvenNumbers should take the even numbers and double them (3 ms) + +Test Suites: 1 passed, 1 total +Tests: 1 passed, 1 total +Snapshots: 0 total +Time: 0.635 s, estimated 1 s +Ran all test suites matching /C:\\Users\\Rimha\\Assignments-Cohort54\\1-JavaScript\\Week3\\assignment\\ex1-doubleEvenNumbers.test.js/i. +No linting errors detected. +No spelling errors detected. diff --git a/1-JavaScript/Week3/test-reports/ex4-observable.report.txt b/1-JavaScript/Week3/test-reports/ex4-observable.report.txt new file mode 100644 index 000000000..ad3ba4633 --- /dev/null +++ b/1-JavaScript/Week3/test-reports/ex4-observable.report.txt @@ -0,0 +1,15 @@ +*** Unit Test Error Report *** + + PASS 1-JavaScript/Week3/assignment/ex4-observable/ex4-observable.test.js + js-wk3-ex4-observable + ✅ createObservable should exist and be a function (2 ms) + ✅ createObservable should return an object with `subscribe` and a `notify` function properties (1 ms) + ✅ observable should notify all subscribers of any notification (1 ms) + +Test Suites: 1 passed, 1 total +Tests: 3 passed, 3 total +Snapshots: 0 total +Time: 0.627 s, estimated 1 s +Ran all test suites matching /C:\\Users\\Rimha\\Assignments-Cohort54\\1-JavaScript\\Week3\\assignment\\ex4-observable\\ex4-observable.test.js/i. +No linting errors detected. +No spelling errors detected.