From 1f5cb4ffe474113f2120d301766e13ae0acd639c Mon Sep 17 00:00:00 2001 From: Khor Biel Date: Thu, 6 Nov 2025 18:13:08 +0000 Subject: [PATCH 1/9] Feat: implement and fix array utility functions - Fix calculateMedian to handle sorting, filtering, and edge cases - Implement dedupe to remove duplicates while preserving order - Implement findMax to find maximum number ignoring non-numerics - Implement sum to calculate total ignoring non-numerics - Fix test files by replacing test.todo with proper test implementations --- Sprint-1/fix/median.js | 27 ++++++++- Sprint-1/implement/dedupe.js | 20 ++++++- Sprint-1/implement/dedupe.test.js | 2 + Sprint-1/implement/max.js | 12 ++++ Sprint-1/implement/max.test.js | 91 +++++++++++++++++++++---------- Sprint-1/implement/sum.js | 7 +++ Sprint-1/implement/sum.test.js | 72 +++++++++++++++++------- 7 files changed, 178 insertions(+), 53 deletions(-) diff --git a/Sprint-1/fix/median.js b/Sprint-1/fix/median.js index b22590bc6..abd692c1b 100644 --- a/Sprint-1/fix/median.js +++ b/Sprint-1/fix/median.js @@ -6,9 +6,30 @@ // or 'list' has mixed values (the function is expected to sort only numbers). function calculateMedian(list) { - const middleIndex = Math.floor(list.length / 2); - const median = list.splice(middleIndex, 1)[0]; - return median; + // Return null if input is not an array + if (!Array.isArray(list)) { + return null; + } + + // Filter out non-numeric values (keep only actual numbers) + const numbers = list.filter((item) => typeof item === "number"); + + // Return null if no valid numbers found + if (numbers.length === 0) { + return null; + } + + // Sort numbers in ascending order (create a copy to avoid mutation) + const sorted = [...numbers].sort((a, b) => a - b); + const middleIndex = Math.floor(sorted.length / 2); + + // For odd-length arrays: return middle element + // For even-length arrays: return average of two middle elements + if (sorted.length % 2 === 1) { + return sorted[middleIndex]; + } else { + return (sorted[middleIndex - 1] + sorted[middleIndex]) / 2; + } } module.exports = calculateMedian; diff --git a/Sprint-1/implement/dedupe.js b/Sprint-1/implement/dedupe.js index 781e8718a..f376e2bda 100644 --- a/Sprint-1/implement/dedupe.js +++ b/Sprint-1/implement/dedupe.js @@ -1 +1,19 @@ -function dedupe() {} +function dedupe() { + // Return empty array if input is not an array + if (!Array.isArray(array)) { + return []; + } + + // Use Set to track seen elements and filter duplicates + const seen = new Set(); + const result = []; + + for (const item of array) { + if (!seen.has(item)) { + seen.add(item); + result.push(item); + } + } + + return result; +} diff --git a/Sprint-1/implement/dedupe.test.js b/Sprint-1/implement/dedupe.test.js index 23e0f8638..f8d64250f 100644 --- a/Sprint-1/implement/dedupe.test.js +++ b/Sprint-1/implement/dedupe.test.js @@ -21,7 +21,9 @@ test.todo("given an empty array, it returns an empty array"); // Given an array with no duplicates // When passed to the dedupe function // Then it should return a copy of the original array +test.todo("given an array with no duplicates, it returns the same array"); // Given an array with strings or numbers // When passed to the dedupe function // Then it should remove the duplicate values, preserving the first occurence of each element +test.todo("given an array with duplicates, it removes the duplicates preserving the first occurence"); diff --git a/Sprint-1/implement/max.js b/Sprint-1/implement/max.js index 6dd76378e..e0443510d 100644 --- a/Sprint-1/implement/max.js +++ b/Sprint-1/implement/max.js @@ -1,4 +1,16 @@ function findMax(elements) { + // Filter out non-numeric values and convert to numbers + const numbers = elements + .filter((item) => typeof item === "number") + .map(Number); + + // If no numbers found, return -Infinity + if (numbers.length === 0) { + return -Infinity; + } + + // Find the maximum number + return Math.max(...numbers); } module.exports = findMax; diff --git a/Sprint-1/implement/max.test.js b/Sprint-1/implement/max.test.js index 82f18fd88..b8c3eef08 100644 --- a/Sprint-1/implement/max.test.js +++ b/Sprint-1/implement/max.test.js @@ -12,32 +12,65 @@ We have set things up already so that this file can see your function from the o const findMax = require("./max.js"); -// Given an empty array -// When passed to the max function -// Then it should return -Infinity -// Delete this test.todo and replace it with a test. -test.todo("given an empty array, returns -Infinity"); - -// Given an array with one number -// When passed to the max function -// Then it should return that number - -// Given an array with both positive and negative numbers -// When passed to the max function -// Then it should return the largest number overall - -// Given an array with just negative numbers -// When passed to the max function -// Then it should return the closest one to zero - -// Given an array with decimal numbers -// When passed to the max function -// Then it should return the largest decimal number - -// Given an array with non-number values -// When passed to the max function -// Then it should return the max and ignore non-numeric values - -// Given an array with only non-number values -// When passed to the max function -// Then it should return the least surprising value given how it behaves for all other inputs +describe("findMax", () => { + // Given an empty array + // When passed to the max function + // Then it should return -infinity + test("given an empty array, returns -Infinity", () => { + expect(findMax([])).toBe(-Infinity); + }); + + // Given an array with one number + // When passed to the max function + // Then it should return that number + test("given an array with one number, returns that number", () => { + expect(findMax([5])).toBe(5); + expect(findMax([-10])).toBe(-10); + expect(findMax([0])).toBe(0); + }); + + // Given an array with both positive and negative numbers + // When passed to the max function + // Then it should return the largest number overall + test("given an array with both positive and negative numbers, returns the largest", () => { + expect(findMax([30, 50, 10, 40])).toBe(50); + expect(findMax([-5, -1, -10])).toBe(-1); + expect(findMax([10, -5, 20, -15])).toBe(20); + }); + + // Given an array with just negative numbers + // When passed to the max function + // Then it should return the closest one to zero + test("given an array with just negative numbers, returns the closest to zero", () => { + expect(findMax([-5, -1, -10])).toBe(-1); + expect(findMax([-100, -50, -25])).toBe(-25); + }); + + // Given an array with decimal numbers + // When passed to the max function + // Then it should return the largest decimal number + test("given an array with decimal numbers, returns the largest decimal", () => { + expect(findMax([1.5, 2.7, 1.2])).toBe(2.7); + expect(findMax([0.1, 0.01, 0.001])).toBe(0.1); + expect(findMax([-1.5, -2.7, -1.2])).toBe(-1.2); + }); + + // Given an array with non-number values + // When passed to the max function + // Then it should return the max and ignore non-numeric values + test("given an array with non-number values, ignores them and returns the max number", () => { + expect(findMax(["hey", 10, "hi", 60, 10])).toBe(60); + expect(findMax([30, "hello", 50, null, undefined, 40])).toBe(50); + expect(findMax([true, false, 25, 15])).toBe(25); + }); + + // Given an array with only non-number values + // When passed to the max function + // Then it should return the least surprising value given how it behaves for all other inputs + test("given an array with only non-number values, returns -Infinity", () => { + expect(findMax(["hello", "world"])).toBe(-Infinity); + expect(findMax([null, undefined])).toBe(-Infinity); + expect(findMax([true, false])).toBe(-Infinity); + expect(findMax([{}, []])).toBe(-Infinity); + }); +}); \ No newline at end of file diff --git a/Sprint-1/implement/sum.js b/Sprint-1/implement/sum.js index 9062aafe3..ebc81d453 100644 --- a/Sprint-1/implement/sum.js +++ b/Sprint-1/implement/sum.js @@ -1,4 +1,11 @@ function sum(elements) { + // Filter out non-numeric values and convert to numbers + const numbers = elements + .filter((item) => typeof item === "number") + .map(Number); + + // Sum all numbers using reduce + return numbers.reduce((total, num) => total + num, 0); } module.exports = sum; diff --git a/Sprint-1/implement/sum.test.js b/Sprint-1/implement/sum.test.js index dd0a090ca..420585c16 100644 --- a/Sprint-1/implement/sum.test.js +++ b/Sprint-1/implement/sum.test.js @@ -8,29 +8,61 @@ E.g. sum(['hey', 10, 'hi', 60, 10]), target output: 80 (ignore any non-numerical const sum = require("./sum.js"); -// Acceptance Criteria: +describe("sum", () => { + // Given an empty array + // When passed to the sum function + // Then it should return 0 + test("given an empty array, returns 0", () => { + expect(sum([])).toBe(0); + }); -// Given an empty array -// When passed to the sum function -// Then it should return 0 -test.todo("given an empty array, returns 0") + // Given an array with just one number + // When passed to the sum function + // Then it should return that number + test("given an array with just one number, returns that number", () => { + expect(sum([5])).toBe(5); + expect(sum([-10])).toBe(-10); + expect(sum([0])).toBe(0); + }); -// Given an array with just one number -// When passed to the sum function -// Then it should return that number + // Given an array containing negative numbers + // When passed to the sum function + // Then it should still return the correct total sum + test("given an array containing negative numbers, returns correct sum", () => { + expect(sum([10, -5, 3])).toBe(8); + expect(sum([-1, -2, -3])).toBe(-6); + expect(sum([-10, 20, -5])).toBe(5); + }); -// Given an array containing negative numbers -// When passed to the sum function -// Then it should still return the correct total sum + // Given an array with decimal(float numbers) + // When passed to the sum function + // Then it should return the correct total sum + test("given an array with decimal numbers, returns correct sum", () => { + expect(sum([1.5, 2.5, 1.0])).toBe(5); + expect(sum([0.1, 0.2, 0.3])).toBeCloseTo(0.6); + expect(sum([-1.5, 2.5, -1.0])).toBe(0); + }); -// Given an array with decimal/float numbers -// When passed to the sum function -// Then it should return the correct total sum + // Given an array containing non-number values + // When passed to the sum function + // Then it should ignore the non-numerical values and return the sum of the numerical elements + test("given an array with non-number values, ignores them and returns sum of numbers", () => { + expect(sum(["hey", 10, "hi", 60, 10])).toBe(80); + expect(sum([30, "hello", 50, null, undefined, 40])).toBe(120); + expect(sum([true, false, 25, 15])).toBe(40); + expect(sum([10, "20", 30])).toBe(40); // '20' is string, not number + }); -// Given an array containing non-number values -// When passed to the sum function -// Then it should ignore the non-numerical values and return the sum of the numerical elements + // Additional test cases + test("given an array with only non-number values, returns 0", () => { + expect(sum(["hello", "world"])).toBe(0); + expect(sum([null, undefined])).toBe(0); + expect(sum([true, false])).toBe(0); + expect(sum([{}, []])).toBe(0); + }); -// Given an array with only non-number values -// When passed to the sum function -// Then it should return the least surprising value given how it behaves for all other inputs + test("given example from requirements", () => { + expect(sum([10, 20, 30])).toBe(60); + expect(sum(["hey", 10, "hi", 60, 10])).toBe(80); + }); +}); \ No newline at end of file From 34a5b177d4ba228672eb460c7335624ef33bf5b9 Mon Sep 17 00:00:00 2001 From: Khor Biel Date: Fri, 7 Nov 2025 00:10:45 +0000 Subject: [PATCH 2/9] Implemented include files --- Sprint-1/refactor/includes.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sprint-1/refactor/includes.js b/Sprint-1/refactor/includes.js index 29dad81f0..977c47a4a 100644 --- a/Sprint-1/refactor/includes.js +++ b/Sprint-1/refactor/includes.js @@ -1,13 +1,13 @@ // Refactor the implementation of includes to use a for...of loop function includes(list, target) { - for (let index = 0; index < list.length; index++) { - const element = list[index]; + for (const element of list) { if (element === target) { return true; } } return false; + } module.exports = includes; From bd8443b359a190a97807c7cb38bb3e44063487cd Mon Sep 17 00:00:00 2001 From: Khor Biel Date: Sat, 8 Nov 2025 15:02:55 +0000 Subject: [PATCH 3/9] Added dedupe tests and implementation to remove array duplicates --- Sprint-1/implement/dedupe.js | 20 ++++---------------- Sprint-1/implement/dedupe.test.js | 14 +++++++++++--- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/Sprint-1/implement/dedupe.js b/Sprint-1/implement/dedupe.js index f376e2bda..ef4af83ef 100644 --- a/Sprint-1/implement/dedupe.js +++ b/Sprint-1/implement/dedupe.js @@ -1,19 +1,7 @@ -function dedupe() { - // Return empty array if input is not an array - if (!Array.isArray(array)) { - return []; - } - // Use Set to track seen elements and filter duplicates - const seen = new Set(); - const result = []; +function dedupe(arr) { + return [...new Set(arr)]; +} - for (const item of array) { - if (!seen.has(item)) { - seen.add(item); - result.push(item); - } - } +module.exports = dedupe; - return result; -} diff --git a/Sprint-1/implement/dedupe.test.js b/Sprint-1/implement/dedupe.test.js index f8d64250f..0ad7b71e0 100644 --- a/Sprint-1/implement/dedupe.test.js +++ b/Sprint-1/implement/dedupe.test.js @@ -16,14 +16,22 @@ E.g. dedupe([1, 2, 1]) target output: [1, 2] // Given an empty array // When passed to the dedupe function // Then it should return an empty array -test.todo("given an empty array, it returns an empty array"); +test("given an empty array, it returns an empty array", () => { + expect(dedupe([])).toEqual([]); +}); // Given an array with no duplicates // When passed to the dedupe function // Then it should return a copy of the original array -test.todo("given an array with no duplicates, it returns the same array"); +test("given an array with no duplicates, it returns the same array", () => { + expect(dedupe([1, 2, 3])).toEqual([1, 2, 3]); + expect(dedupe(["a", "b", "c"])).toEqual(["a", "b", "c"]); +}); // Given an array with strings or numbers // When passed to the dedupe function // Then it should remove the duplicate values, preserving the first occurence of each element -test.todo("given an array with duplicates, it removes the duplicates preserving the first occurence"); +test("given an array with duplicates, it removes the duplicates preserving the first occurrence", () => { + expect(dedupe(["a", "a", "b", "c", "b"])).toEqual(["a", "b", "c"]); + expect(dedupe([5, 1, 1, 2, 3, 2, 5, 8])).toEqual([5, 1, 2, 3, 8]); +}); From 3a84e6780e79573bf274ad938ce0419b850f62b5 Mon Sep 17 00:00:00 2001 From: Khor Biel Date: Fri, 21 Nov 2025 16:38:07 +0000 Subject: [PATCH 4/9] fix(median): remove unnecessary array cloning and improve numeric filtering - Only keep finite numeric values using Number.isFinite() - Remove redundant [...numbers] clone since .filter() already creates a new array - Add clearer comments about non-mutation and sorting behavior - Preserve expected behaviour: return null for invalid or empty numeric inputs --- Sprint-1/fix/median.js | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/Sprint-1/fix/median.js b/Sprint-1/fix/median.js index abd692c1b..b30420c57 100644 --- a/Sprint-1/fix/median.js +++ b/Sprint-1/fix/median.js @@ -5,31 +5,29 @@ // Hint: Please consider scenarios when 'list' doesn't have numbers (the function is expected to return null) // or 'list' has mixed values (the function is expected to sort only numbers). + function calculateMedian(list) { - // Return null if input is not an array + if (!Array.isArray(list)) { return null; } - // Filter out non-numeric values (keep only actual numbers) - const numbers = list.filter((item) => typeof item === "number"); + const numbers = list.filter((item) => Number.isFinite(item)); - // Return null if no valid numbers found if (numbers.length === 0) { return null; } - // Sort numbers in ascending order (create a copy to avoid mutation) - const sorted = [...numbers].sort((a, b) => a - b); - const middleIndex = Math.floor(sorted.length / 2); + numbers.sort((a, b) => a - b); + + const middleIndex = Math.floor(numbers.length / 2); - // For odd-length arrays: return middle element - // For even-length arrays: return average of two middle elements - if (sorted.length % 2 === 1) { - return sorted[middleIndex]; + if (numbers.length % 2 === 1) { + return numbers[middleIndex]; } else { - return (sorted[middleIndex - 1] + sorted[middleIndex]) / 2; + return (numbers[middleIndex - 1] + numbers[middleIndex]) / 2; } } + module.exports = calculateMedian; From b837edf0d8aee804097556a71131378309f6d49c Mon Sep 17 00:00:00 2001 From: Khor Biel Date: Fri, 21 Nov 2025 17:03:24 +0000 Subject: [PATCH 5/9] Fixed dedupe.test.js --- Sprint-1/implement/dedupe.test.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/Sprint-1/implement/dedupe.test.js b/Sprint-1/implement/dedupe.test.js index 0ad7b71e0..1ac155841 100644 --- a/Sprint-1/implement/dedupe.test.js +++ b/Sprint-1/implement/dedupe.test.js @@ -23,9 +23,18 @@ test("given an empty array, it returns an empty array", () => { // Given an array with no duplicates // When passed to the dedupe function // Then it should return a copy of the original array -test("given an array with no duplicates, it returns the same array", () => { - expect(dedupe([1, 2, 3])).toEqual([1, 2, 3]); - expect(dedupe(["a", "b", "c"])).toEqual(["a", "b", "c"]); +test("given an array with no duplicates, it returns a copy (not the same array)", () => { + const arr1 = [1, 2, 3]; + const result1 = dedupe(arr1); + + expect(result1).toEqual(arr1); // values match + expect(result1).not.toBe(arr1); // different reference + + const arr2 = ["a", "b", "c"]; + const result2 = dedupe(arr2); + + expect(result2).toEqual(arr2); + expect(result2).not.toBe(arr2); }); // Given an array with strings or numbers From f9840eb91bcf73237e791afe10a1d000bc46d85b Mon Sep 17 00:00:00 2001 From: Khor Biel Date: Fri, 21 Nov 2025 17:05:37 +0000 Subject: [PATCH 6/9] fix(max): filter only finite numbers and remove redundant .map(Number) - Use typeof === "number" and Number.isFinite to keep only actual finite numbers - Remove unnecessary .map(Number) after filtering - Return -Infinity when no numeric values are present - Add defensive guard for non-array inputs --- Sprint-1/implement/max.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Sprint-1/implement/max.js b/Sprint-1/implement/max.js index e0443510d..4303c2621 100644 --- a/Sprint-1/implement/max.js +++ b/Sprint-1/implement/max.js @@ -1,15 +1,20 @@ function findMax(elements) { - // Filter out non-numeric values and convert to numbers - const numbers = elements - .filter((item) => typeof item === "number") - .map(Number); + // Guard: if input is not an array, behave defensively and return -Infinity + if (!Array.isArray(elements)) { + return -Infinity; + } + + // Keep only actual numeric values (excludes booleans, strings, null, undefined, NaN, Infinity) + const numbers = elements.filter( + (item) => typeof item === "number" && Number.isFinite(item) + ); // If no numbers found, return -Infinity if (numbers.length === 0) { return -Infinity; } - // Find the maximum number + // Find and return the maximum number return Math.max(...numbers); } From 1005a8802b156ae151392ed7d07ef853e5d7f1e2 Mon Sep 17 00:00:00 2001 From: Khor Biel Date: Fri, 21 Nov 2025 17:36:52 +0000 Subject: [PATCH 7/9] fix(max): only consider finite numbers, remove redundant .map(Number) - Filters array to keep only real numbers - Returns -Infinity when no numbers are present - Preserves behavior for decimals, negatives, and mixed arrays --- Sprint-1/implement/max.js | 12 ++---------- Sprint-1/implement/max.test.js | 5 ++++- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/Sprint-1/implement/max.js b/Sprint-1/implement/max.js index 4303c2621..7c81e4797 100644 --- a/Sprint-1/implement/max.js +++ b/Sprint-1/implement/max.js @@ -1,20 +1,12 @@ function findMax(elements) { - // Guard: if input is not an array, behave defensively and return -Infinity - if (!Array.isArray(elements)) { - return -Infinity; - } + if (!Array.isArray(elements)) return -Infinity; - // Keep only actual numeric values (excludes booleans, strings, null, undefined, NaN, Infinity) const numbers = elements.filter( (item) => typeof item === "number" && Number.isFinite(item) ); - // If no numbers found, return -Infinity - if (numbers.length === 0) { - return -Infinity; - } + if (numbers.length === 0) return -Infinity; - // Find and return the maximum number return Math.max(...numbers); } diff --git a/Sprint-1/implement/max.test.js b/Sprint-1/implement/max.test.js index b8c3eef08..98c57a242 100644 --- a/Sprint-1/implement/max.test.js +++ b/Sprint-1/implement/max.test.js @@ -73,4 +73,7 @@ describe("findMax", () => { expect(findMax([true, false])).toBe(-Infinity); expect(findMax([{}, []])).toBe(-Infinity); }); -}); \ No newline at end of file +}); + + + From 0d0c1280f6d8a27b6c1b92ba6fb615c36af5b5f4 Mon Sep 17 00:00:00 2001 From: Khor Biel Date: Fri, 21 Nov 2025 17:39:27 +0000 Subject: [PATCH 8/9] fix(sum): remove redundant .map(Number) and improve decimal & non-number tests - Filter now only includes finite numbers - Decimal sums use toBeCloseTo for precision - Removed duplicate or meaningless tests --- Sprint-1/implement/sum.js | 8 ++++---- Sprint-1/implement/sum.test.js | 31 +++++-------------------------- 2 files changed, 9 insertions(+), 30 deletions(-) diff --git a/Sprint-1/implement/sum.js b/Sprint-1/implement/sum.js index ebc81d453..bd8f7ba1a 100644 --- a/Sprint-1/implement/sum.js +++ b/Sprint-1/implement/sum.js @@ -1,8 +1,8 @@ function sum(elements) { - // Filter out non-numeric values and convert to numbers - const numbers = elements - .filter((item) => typeof item === "number") - .map(Number); + // Filter out only numeric values + const numbers = elements.filter( + (item) => typeof item === "number" && Number.isFinite(item) + ); // Sum all numbers using reduce return numbers.reduce((total, num) => total + num, 0); diff --git a/Sprint-1/implement/sum.test.js b/Sprint-1/implement/sum.test.js index 420585c16..a089ce0fb 100644 --- a/Sprint-1/implement/sum.test.js +++ b/Sprint-1/implement/sum.test.js @@ -9,60 +9,39 @@ E.g. sum(['hey', 10, 'hi', 60, 10]), target output: 80 (ignore any non-numerical const sum = require("./sum.js"); describe("sum", () => { - // Given an empty array - // When passed to the sum function - // Then it should return 0 test("given an empty array, returns 0", () => { expect(sum([])).toBe(0); }); - // Given an array with just one number - // When passed to the sum function - // Then it should return that number - test("given an array with just one number, returns that number", () => { + test("given an array with one number, returns that number", () => { expect(sum([5])).toBe(5); expect(sum([-10])).toBe(-10); expect(sum([0])).toBe(0); }); - // Given an array containing negative numbers - // When passed to the sum function - // Then it should still return the correct total sum test("given an array containing negative numbers, returns correct sum", () => { expect(sum([10, -5, 3])).toBe(8); expect(sum([-1, -2, -3])).toBe(-6); expect(sum([-10, 20, -5])).toBe(5); }); - // Given an array with decimal(float numbers) - // When passed to the sum function - // Then it should return the correct total sum test("given an array with decimal numbers, returns correct sum", () => { - expect(sum([1.5, 2.5, 1.0])).toBe(5); + expect(sum([1.5, 2.5, 1.0])).toBeCloseTo(5); expect(sum([0.1, 0.2, 0.3])).toBeCloseTo(0.6); - expect(sum([-1.5, 2.5, -1.0])).toBe(0); + expect(sum([-1.5, 2.5, -1.0])).toBeCloseTo(0); }); - // Given an array containing non-number values - // When passed to the sum function - // Then it should ignore the non-numerical values and return the sum of the numerical elements test("given an array with non-number values, ignores them and returns sum of numbers", () => { expect(sum(["hey", 10, "hi", 60, 10])).toBe(80); expect(sum([30, "hello", 50, null, undefined, 40])).toBe(120); expect(sum([true, false, 25, 15])).toBe(40); - expect(sum([10, "20", 30])).toBe(40); // '20' is string, not number + expect(sum([10, "20", 30])).toBe(40); // string '20' ignored }); - // Additional test cases test("given an array with only non-number values, returns 0", () => { expect(sum(["hello", "world"])).toBe(0); expect(sum([null, undefined])).toBe(0); expect(sum([true, false])).toBe(0); expect(sum([{}, []])).toBe(0); }); - - test("given example from requirements", () => { - expect(sum([10, 20, 30])).toBe(60); - expect(sum(["hey", 10, "hi", 60, 10])).toBe(80); - }); -}); \ No newline at end of file +}); From 051e212ccced84f0278f68646e5a3962ef9ed23e Mon Sep 17 00:00:00 2001 From: Khor Biel Date: Fri, 21 Nov 2025 17:43:40 +0000 Subject: [PATCH 9/9] refactor(includes): use for...of loop and add input guard - Replace index-based loop with a clearer for...of loop - Return false early for non-array inputs to avoid runtime errors - Keep behaviour identical: returns true if target found, otherwise false --- Sprint-1/refactor/includes.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Sprint-1/refactor/includes.js b/Sprint-1/refactor/includes.js index 977c47a4a..e556250ef 100644 --- a/Sprint-1/refactor/includes.js +++ b/Sprint-1/refactor/includes.js @@ -1,13 +1,16 @@ // Refactor the implementation of includes to use a for...of loop function includes(list, target) { + if (!Array.isArray(list)) { + return false; + } + for (const element of list) { if (element === target) { return true; } } return false; - } module.exports = includes;