diff --git a/src/functions-and-arrays.js b/src/functions-and-arrays.js
index 3a7dbec41..da33c440b 100644
--- a/src/functions-and-arrays.js
+++ b/src/functions-and-arrays.js
@@ -1,130 +1,104 @@
-// Iteration #1: Find the maximum
-function maxOfTwoNumbers() {}
-
-
-
-// Iteration #2: Find longest word
-const words = ['mystery', 'brother', 'aviator', 'crocodile', 'pearl', 'orchard', 'crackpot'];
-
-function findLongestWord() {}
-
-
-
-// Iteration #3: Calculate the sum
-const numbers = [6, 12, 1, 18, 13, 16, 2, 1, 8, 10];
-
-function sumNumbers() {}
-
-
-
-// Iteration #3.1 Bonus:
-function sum() {}
-
-
-
-// Iteration #4: Calculate the average
-// Level 1: Array of numbers
-const numbersAvg = [2, 6, 9, 10, 7, 4, 1, 9];
-
-function averageNumbers() {}
-
-
-// Level 2: Array of strings
-const wordsArr = ['seat', 'correspond', 'linen', 'motif', 'hole', 'smell', 'smart', 'chaos', 'fuel', 'palace'];
-
-function averageWordLength() { }
-
-// Bonus - Iteration #4.1
-function avg() {}
-
-// Iteration #5: Unique arrays
-const wordsUnique = [
-  'crab',
-  'poison',
-  'contagious',
-  'simple',
-  'bring',
-  'sharp',
-  'playground',
-  'poison',
-  'communion',
-  'simple',
-  'bring'
-];
-
-function uniquifyArray() {}
+function maxOfTwoNumbers(a, b) {
+  return a > b ? a : b;
+}
 
+function findLongestWord(words) {
+  if (!words.length) return null;
 
+  return words.reduce((longest, current) =>
+    current.length > longest.length ? current : longest
+  );
+}
 
-// Iteration #6: Find elements
-const wordsFind = ['machine', 'subset', 'trouble', 'starting', 'matter', 'eating', 'truth', 'disobedience'];
+function sumNumbers(arr) {
+  return arr.reduce((total, actual) => {
+    return total + actual;
+  }, 0);
+  // let result = 0;
 
-function doesWordExist() {}
+  // for(let i=0; i<arr.length; i++){
+  //   result += arr[i];
+  // }
 
+  // return result;
+}
 
+function sum(arr) {
+  if (!arr.length) return 0;
 
-// Iteration #7: Count repetition
-const wordsCount = [
-  'machine',
-  'matter',
-  'subset',
-  'trouble',
-  'starting',
-  'matter',
-  'eating',
-  'matter',
-  'truth',
-  'disobedience',
-  'matter'
-];
+  return arr.reduce((acc, elem) => {
+    if (typeof elem === "number") return acc + elem;
+    if (typeof elem === "string") return acc + elem.length;
+    if (typeof elem === "boolean") return acc + (elem ? 1 : 0);
+    throw new Error("Tipo de dato no soportado");
+  }, 0);
+}
 
-function howManyTimes() {}
+function averageNumbers(numbers) {
+  if (!numbers.length) return null;
 
+  return sum(numbers) / numbers.length;
+}
 
+function averageWordLength(words) {
+  if (!words.length) return null;
 
-// Iteration #8: Bonus
-const matrix = [
-  [8, 2, 22, 97, 38, 15, 0, 40, 0, 75, 4, 5, 7, 78, 52, 12, 50, 77, 91, 8],
-  [49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 17, 40, 98, 43, 69, 48, 4, 56, 62, 0],
-  [81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 40, 67, 53, 88, 30, 3, 49, 13, 36, 65],
-  [52, 70, 95, 23, 4, 60, 11, 42, 69, 24, 68, 56, 1, 32, 56, 71, 37, 2, 36, 91],
-  [22, 31, 16, 71, 51, 67, 63, 89, 41, 92, 36, 54, 22, 40, 40, 28, 66, 33, 13, 80],
-  [24, 47, 32, 60, 99, 3, 45, 2, 44, 75, 33, 53, 78, 36, 84, 20, 35, 17, 12, 50],
-  [32, 98, 81, 28, 64, 23, 67, 10, 26, 38, 40, 67, 59, 54, 70, 66, 18, 38, 64, 70],
-  [67, 26, 20, 68, 2, 62, 12, 20, 95, 63, 94, 39, 63, 8, 40, 91, 66, 49, 94, 21],
-  [24, 55, 58, 5, 66, 73, 99, 26, 97, 17, 78, 78, 96, 83, 14, 88, 34, 89, 63, 72],
-  [21, 36, 23, 9, 75, 0, 76, 44, 20, 45, 35, 14, 0, 61, 33, 97, 34, 31, 33, 95],
-  [78, 17, 53, 28, 22, 75, 31, 67, 15, 94, 3, 80, 4, 62, 16, 14, 9, 53, 56, 92],
-  [16, 39, 5, 42, 96, 35, 31, 47, 55, 58, 88, 24, 0, 17, 54, 24, 36, 29, 85, 57],
-  [86, 56, 0, 48, 35, 71, 89, 7, 5, 44, 44, 37, 44, 60, 21, 58, 51, 54, 17, 58],
-  [19, 80, 81, 68, 5, 94, 47, 69, 28, 73, 92, 13, 86, 52, 17, 77, 4, 89, 55, 40],
-  [4, 52, 8, 83, 97, 35, 99, 16, 7, 97, 57, 32, 16, 26, 26, 79, 33, 27, 98, 66],
-  [88, 36, 68, 87, 57, 62, 20, 72, 3, 46, 33, 67, 46, 55, 12, 32, 63, 93, 53, 69],
-  [4, 42, 16, 73, 38, 25, 39, 11, 24, 94, 72, 18, 8, 46, 29, 32, 40, 62, 76, 36],
-  [20, 69, 36, 41, 72, 30, 23, 88, 34, 62, 99, 69, 82, 67, 59, 85, 74, 4, 36, 16],
-  [20, 73, 35, 29, 78, 31, 90, 1, 74, 31, 49, 71, 48, 86, 81, 16, 23, 57, 5, 54],
-  [1, 70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52, 1, 89, 19, 67, 48]
-];
+  return sum(words) / words.length;
+}
 
-function greatestProduct() {}
+function avg(arr) {
+  if (!arr.length) return null;
+  return sum(arr) / arr.length;
+}
 
+function uniquifyArray(arr) {
+  if (!arr.length) return null;
+  return [...new Set(arr)];
+}
 
+function doesWordExist(arr, word) {
+  if (!arr.length) return null;
+  return arr.includes(word);
+}
 
+function howManyTimes(arr, word) {
+  return arr.filter((item) => item === word).length;
+}
 
-// The following is required to make unit tests work.
-/* Environment setup. Do not modify the below code. */
-if (typeof module !== 'undefined') {
-  module.exports = {
-    maxOfTwoNumbers,
-    findLongestWord,
-    sumNumbers,
-    sum,
-    averageNumbers,
-    averageWordLength,
-    avg,
-    uniquifyArray,
-    doesWordExist,
-    howManyTimes,
-    greatestProduct
-  };
+function calculate(maxValue, currentIndex) {
+  if (currentIndex < 0) currentIndex = -currentIndex;
+  return currentIndex % maxValue;
 }
+
+function greatestProductOfDiagonals(matrix) {
+  if (matrix.length < 4) return 0;
+
+  let dimension = matrix.length;
+  let diagonals = [];
+
+  for (let i = 0; i < dimension; i++) {
+    let counter = 1;
+    let matrixIndexI = i;
+
+    for (let j = 0; j < dimension; j++) {
+      counter *=
+        matrix[calculate(dimension, matrixIndexI)][calculate(dimension, j)];
+      matrixIndexI++;
+    }
+    diagonals.push(counter);
+  }
+
+  for (let i = dimension - 1; i >= 0; i--) {
+    let counter = 1;
+    let matrixIndexI = i;
+
+    for (let j = dimension - 1; j >= 0; j--) {
+      counter *=
+        matrix[calculate(dimension, matrixIndexI)][calculate(dimension, j)];
+      matrixIndexI++;
+    }
+    diagonals.push(counter);
+  }
+
+  return Math.max(...diagonals);
+}
\ No newline at end of file
diff --git a/tests/functions-and-arrays.spec.js b/tests/functions-and-arrays.spec.js
index 21ec1130c..35185ebbb 100644
--- a/tests/functions-and-arrays.spec.js
+++ b/tests/functions-and-arrays.spec.js
@@ -12,270 +12,309 @@ const shuffle = (currentArray) => {
   return array;
 };
 
-
-
-describe('Find the maximum', () => {
-  it('should declare a function named maxOfTwoNumbers', () => {
-    expect(typeof maxOfTwoNumbers).toBe('function');
+describe("Find the maximum", () => {
+  it("should declare a function named maxOfTwoNumbers", () => {
+    expect(typeof maxOfTwoNumbers).toBe("function");
   });
 
-  it('should return greater of two arguments - if the first argument greater', () => {
+  it("should return greater of two arguments - if the first argument greater", () => {
     expect(maxOfTwoNumbers(2, 1)).toBe(2);
     expect(maxOfTwoNumbers(5, -7)).toBe(5);
   });
 
-  it('should return greater of two arguments - if the second argument greater', () => {
+  it("should return greater of two arguments - if the second argument greater", () => {
     expect(maxOfTwoNumbers(1, 3)).toBe(3);
     expect(maxOfTwoNumbers(-5, 3)).toBe(3);
   });
 
-  it('should return either arguments - if both arguments are equal', () => {
+  it("should return either arguments - if both arguments are equal", () => {
     expect(maxOfTwoNumbers(4, 4)).toBe(4);
   });
 });
 
-describe('Find the longest word', () => {
-  it('should declare a function named findLongestWord', () => {
-    expect(typeof findLongestWord).toBe('function');
+describe("Find the longest word", () => {
+  it("should declare a function named findLongestWord", () => {
+    expect(typeof findLongestWord).toBe("function");
   });
 
-  it('should return null when called with an empty array', () => {
+  it("should return null when called with an empty array", () => {
     expect(findLongestWord([])).toBe(null);
   });
 
-  it('should return the word when called with a single-word array', () => {
-    expect(findLongestWord(['foo'])).toBe('foo');
+  it("should return the word when called with a single-word array", () => {
+    expect(findLongestWord(["foo"])).toBe("foo");
   });
 
-  it('should return the first occurrence of the word when longest have multiple occurrences ', () => {
-    expect(findLongestWord(['foo', 'bar'])).toBe('foo');
-    expect(findLongestWord(['bar', 'foo'])).toBe('bar');
+  it("should return the first occurrence of the word when longest have multiple occurrences ", () => {
+    expect(findLongestWord(["foo", "bar"])).toBe("foo");
+    expect(findLongestWord(["bar", "foo"])).toBe("bar");
   });
 
-  it('should return the longest occurrence when it has multiple words', () => {
-    let words = ['a', 'zab', '12abc', '$$abcd', 'abcde', 'ironhack'];
+  it("should return the longest occurrence when it has multiple words", () => {
+    let words = ["a", "zab", "12abc", "$$abcd", "abcde", "ironhack"];
     for (let i = 0; i < 10; i++) {
       words = shuffle(words);
-      expect(findLongestWord(words)).toBe('ironhack');
+      expect(findLongestWord(words)).toBe("ironhack");
     }
   });
 });
 
-describe('Calculate the sum of array of numbers', () => {
-  it('should declare a function named sumNumbers', () => {
-    expect(typeof sumNumbers).toBe('function');
+describe("Calculate the sum of array of numbers", () => {
+  it("should declare a function named sumNumbers", () => {
+    expect(typeof sumNumbers).toBe("function");
   });
 
-  it('should return zero if receives an empty array when called', () => {
+  it("should return zero if receives an empty array when called", () => {
     expect(sumNumbers([])).toBe(0);
   });
 
-  it('should return the sum with one number array', () => {
+  it("should return the sum with one number array", () => {
     expect(sumNumbers([4])).toBe(4);
   });
 
-  it('should return zero if all elements are zero', () => {
+  it("should return zero if all elements are zero", () => {
     expect(sumNumbers([0, 0, 0, 0, 0])).toBe(0);
   });
 
-  it('should return the sum when passed array of numbers', () => {
+  it("should return the sum when passed array of numbers", () => {
     expect(sumNumbers([10, 5, 4, 32, 8])).toBe(59);
   });
 });
 
-describe('Bonus: Calculate the sum', () => {
-  it('should declare a function named sum', () => {
-    expect(typeof sum).toBe('function');
+describe("Bonus: Calculate the sum", () => {
+  it("should declare a function named sum", () => {
+    expect(typeof sum).toBe("function");
   });
 
-  it('should return zero if receives an empty array when called', () => {
+  it("should return zero if receives an empty array when called", () => {
     expect(sum([])).toBe(0);
   });
 
-  it('should return the sum with one number array', () => {
+  it("should return the sum with one number array", () => {
     expect(sum([4])).toBe(4);
   });
 
-  it('should return zero if all elements are zero', () => {
+  it("should return zero if all elements are zero", () => {
     expect(sum([0, 0, 0, 0, 0])).toBe(0);
   });
 
-  it('should return the sum when passed array of numbers', () => {
+  it("should return the sum when passed array of numbers", () => {
     expect(sum([10, 5, 4, 32, 8])).toBe(59);
   });
 
-  it('should return the sum when passed array of strings', () => {
-    expect(sum(['ana', 'marco', 'nicolas', 'tania', 'ptwd'])).toBe(24);
+  it("should return the sum when passed array of strings", () => {
+    expect(sum(["ana", "marco", "nicolas", "tania", "ptwd"])).toBe(24);
   });
 
-  it('should return the sum when passed array of mixed strings and numbers - ', () => {
-    expect(sum([6, 12, 'miami', 1, 'barca', '200', 'lisboa', 8, 10])).toBe(56);
+  it("should return the sum when passed array of mixed strings and numbers - ", () => {
+    expect(sum([6, 12, "miami", 1, "barca", "200", "lisboa", 8, 10])).toBe(56);
   });
 
-  it('should return the sum when passed array of mixed strings, numbers and booleans - ', () => {
+  it("should return the sum when passed array of mixed strings, numbers and booleans - ", () => {
     // false is counted as 0
-    expect(sum([6, 12, 'miami', 1, 'barca', '200', 'lisboa', 8, false])).toBe(46);
+    expect(sum([6, 12, "miami", 1, "barca", "200", "lisboa", 8, false])).toBe(
+      46
+    );
     // true is counted as 1
-    expect(sum([6, 12, 'miami', 1, 'barca', '200', 'lisboa', 8, true])).toBe(47);
+    expect(sum([6, 12, "miami", 1, "barca", "200", "lisboa", 8, true])).toBe(
+      47
+    );
   });
 
-  it('should throw an error when unsupported data type (object or array) present in the array', () => {
-    expect(() => sum([6, 12, 'miami', 1, 'barca', '200', 'lisboa', 8, [], {}])).toThrow();
+  it("should throw an error when unsupported data type (object or array) present in the array", () => {
+    expect(() =>
+      sum([6, 12, "miami", 1, "barca", "200", "lisboa", 8, [], {}])
+    ).toThrow();
   });
-
 });
 
-describe('Calculate the average of an array of numbers', () => {
-  it('should declare a function named averageNumbers', () => {
-    expect(typeof averageNumbers).toBe('function');
+describe("Calculate the average of an array of numbers", () => {
+  it("should declare a function named averageNumbers", () => {
+    expect(typeof averageNumbers).toBe("function");
   });
 
-  it('should return null if receives an empty array when called', () => {
+  it("should return null if receives an empty array when called", () => {
     expect(averageNumbers([])).toBe(null);
   });
 
-  it('should return the average of a one-element array', () => {
+  it("should return the average of a one-element array", () => {
     expect(averageNumbers([9])).toBe(9);
   });
 
-  it('should return the average even with negative values', () => {
+  it("should return the average even with negative values", () => {
     expect(averageNumbers([9, -3, -4, 6])).toBe(2);
   });
 
-  it('should return the average of the array', () => {
+  it("should return the average of the array", () => {
     expect(averageNumbers([9, 10, 82, 92, 32, 102, 58])).toBe(55);
   });
-  
 });
 
-describe('Calculate the average of an array of strings', () => {
-  it('should declare a function named averageWordLength', () => {
-    expect(typeof averageWordLength).toBe('function');
+describe("Calculate the average of an array of strings", () => {
+  it("should declare a function named averageWordLength", () => {
+    expect(typeof averageWordLength).toBe("function");
   });
 
-  it('should return null if receives an empty array when called', () => {
+  it("should return null if receives an empty array when called", () => {
     expect(averageWordLength([])).toBe(null);
   });
 
-  it('should return the average of a one-element array', () => {
-    expect(averageWordLength(['ironhack'])).toBe(8);
+  it("should return the average of a one-element array", () => {
+    expect(averageWordLength(["ironhack"])).toBe(8);
   });
 
-  it('should return the average of a the array', () => {
+  it("should return the average of a the array", () => {
     expect(
-      averageWordLength(['Ironhack', 'Madrid', 'Barcelona', 'Paris', 'Miami', 'Mexico', 'Berlin', 'Programmers'])
+      averageWordLength([
+        "Ironhack",
+        "Madrid",
+        "Barcelona",
+        "Paris",
+        "Miami",
+        "Mexico",
+        "Berlin",
+        "Programmers",
+      ])
     ).toBe(7);
   });
 });
 
-describe('Bonus: Calculate the average of a mixed elements array', () => {
-  it('should declare a function named avg', () => {
-    expect(typeof avg).toBe('function');
+describe("Bonus: Calculate the average of a mixed elements array", () => {
+  it("should declare a function named avg", () => {
+    expect(typeof avg).toBe("function");
   });
 
-  it('should return null if receives an empty array when called', () => {
+  it("should return null if receives an empty array when called", () => {
     expect(avg([])).toBe(null);
   });
 
-  it('should return the average of the array', () => {
+  it("should return the average of the array", () => {
     // false is counted as 0
-    expect(avg([6, 12, 'miami', 1, 'barca', '200', 'lisboa', 8, false])).toBe(46/9);
+    expect(avg([6, 12, "miami", 1, "barca", "200", "lisboa", 8, false])).toBe(
+      46 / 9
+    );
     // true is counted as 1
-    expect(avg([6, 12, 'miami', 1, 'barca', '200', 'lisboa', 8, true])).toBe(47/9);
+    expect(avg([6, 12, "miami", 1, "barca", "200", "lisboa", 8, true])).toBe(
+      47 / 9
+    );
   });
 });
 
-describe('Unique array', () => {
-  it('should declare a function named uniquifyArray', () => {
-    expect(typeof uniquifyArray).toBe('function');
+describe("Unique array", () => {
+  it("should declare a function named uniquifyArray", () => {
+    expect(typeof uniquifyArray).toBe("function");
   });
 
-  it('should return null if receives an empty array when called', () => {
+  it("should return null if receives an empty array when called", () => {
     expect(uniquifyArray([])).toEqual(null);
   });
 
-  it('should return the correct uniqified array when an array of the same elements passed as argument', () => {
-    expect(uniquifyArray(['Ironhack', 'Ironhack', 'Ironhack'])).toEqual(['Ironhack']);
+  it("should return the correct uniqified array when an array of the same elements passed as argument", () => {
+    expect(uniquifyArray(["Ironhack", "Ironhack", "Ironhack"])).toEqual([
+      "Ironhack",
+    ]);
   });
 
-  it('should return the same array when no element is repeated', () => {
-    expect(uniquifyArray(['Cat', 'Dog', 'Cow'])).toEqual(['Cat', 'Dog', 'Cow']);
+  it("should return the same array when no element is repeated", () => {
+    expect(uniquifyArray(["Cat", "Dog", "Cow"])).toEqual(["Cat", "Dog", "Cow"]);
   });
 
-  it('should return the uniquified array', () => {
+  it("should return the uniquified array", () => {
     expect(
-      uniquifyArray(['iPhone', 'Samsung', 'Android', 'iOS', 'iPhone', 'Samsung', 'Nokia', 'Blackberry', 'Android'])
-    ).toEqual(['iPhone', 'Samsung', 'Android', 'iOS', 'Nokia', 'Blackberry']);
+      uniquifyArray([
+        "iPhone",
+        "Samsung",
+        "Android",
+        "iOS",
+        "iPhone",
+        "Samsung",
+        "Nokia",
+        "Blackberry",
+        "Android",
+      ])
+    ).toEqual(["iPhone", "Samsung", "Android", "iOS", "Nokia", "Blackberry"]);
   });
 });
 
-describe('Find elements', () => {
-  it('should declare a function named doesWordExist', () => {
-    expect(typeof doesWordExist).toBe('function');
+describe("Find elements", () => {
+  it("should declare a function named doesWordExist", () => {
+    expect(typeof doesWordExist).toBe("function");
   });
 
-  it('should return null if receives an empty array when called', () => {
+  it("should return null if receives an empty array when called", () => {
     expect(doesWordExist([])).toBe(null);
   });
 
-  it('should return true if the word we are looking for is the only one in the array', () => {
-    expect(doesWordExist(['machine'], 'machine')).toBe(true);
+  it("should return true if the word we are looking for is the only one in the array", () => {
+    expect(doesWordExist(["machine"], "machine")).toBe(true);
   });
 
-  it('should return false if the word we are looking for is not in the array', () => {
-    expect(doesWordExist(['machine', 'poison', 'eat', 'apple', 'horse'], 'ratatouille')).toBe(false);
+  it("should return false if the word we are looking for is not in the array", () => {
+    expect(
+      doesWordExist(
+        ["machine", "poison", "eat", "apple", "horse"],
+        "ratatouille"
+      )
+    ).toBe(false);
   });
 
-  it('should return true if the word we are looking for is in the array', () => {
-    expect(doesWordExist(['pizza', 'sandwich', 'snack', 'soda', 'book', 'computer'], 'book')).toBe(true);
+  it("should return true if the word we are looking for is in the array", () => {
+    expect(
+      doesWordExist(
+        ["pizza", "sandwich", "snack", "soda", "book", "computer"],
+        "book"
+      )
+    ).toBe(true);
   });
 });
 
-describe('Count repetition', () => {
-  it('should declare a function named howManyTimes', () => {
-    expect(typeof howManyTimes).toBe('function');
+describe("Count repetition", () => {
+  it("should declare a function named howManyTimes", () => {
+    expect(typeof howManyTimes).toBe("function");
   });
 
-  it('should return 0 (zero) if receives an empty array when called', () => {
+  it("should return 0 (zero) if receives an empty array when called", () => {
     expect(howManyTimes([])).toBe(0);
   });
 
-  it('should return 1 (one) when the word appears only one time in the array', () => {
-    expect(howManyTimes(['basketball', 'football', 'tennis'], 'tennis')).toBe(1);
+  it("should return 1 (one) when the word appears only one time in the array", () => {
+    expect(howManyTimes(["basketball", "football", "tennis"], "tennis")).toBe(
+      1
+    );
   });
 
   it("should return 0 (zero) when the word doesn't appear in the array", () => {
-    expect(howManyTimes(['basketball', 'football', 'tennis'], 'rugby')).toBe(0);
+    expect(howManyTimes(["basketball", "football", "tennis"], "rugby")).toBe(0);
   });
 
-  it('should return 5 (five) when the word appears 5 times in the array', () => {
+  it("should return 5 (five) when the word appears 5 times in the array", () => {
     expect(
       howManyTimes(
         [
-          'basketball',
-          'football',
-          'tennis',
-          'rugby',
-          'rugby',
-          'ping pong',
-          'rugby',
-          'basketball',
-          'rugby',
-          'handball',
-          'rugby'
+          "basketball",
+          "football",
+          "tennis",
+          "rugby",
+          "rugby",
+          "ping pong",
+          "rugby",
+          "basketball",
+          "rugby",
+          "handball",
+          "rugby",
         ],
-        'rugby'
+        "rugby"
       )
     ).toBe(5);
   });
 });
 
-describe('Bonus Quest - greatestProduct', () => {
-  it('should declare a function named greatestProduct', () => {
-    expect(typeof greatestProduct).toBe('function');
+describe("Bonus Quest - greatestProduct", () => {
+  it("should declare a function named greatestProduct", () => {
+    expect(typeof greatestProduct).toBe("function");
   });
 
-  it('should return 1 (one) when all numbers of the arrays are 1', () => {
+  it("should return 1 (one) when all numbers of the arrays are 1", () => {
     let matrix = [
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
@@ -296,12 +335,12 @@ describe('Bonus Quest - greatestProduct', () => {
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
-      [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
+      [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
     ];
     expect(greatestProduct(matrix)).toBe(1);
   });
 
-  it('should return 16 when all the numbers of the arrays are 2', () => {
+  it("should return 16 when all the numbers of the arrays are 2", () => {
     let matrix = [
       [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
       [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
@@ -322,8 +361,83 @@ describe('Bonus Quest - greatestProduct', () => {
       [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
       [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
       [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
-      [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
+      [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
     ];
     expect(greatestProduct(matrix)).toBe(16);
   });
 });
+
+describe("Bonus Quest - greatestProductOfDiagonals", () => {
+  it("should declare a function named greatestProductOfDiagonals", () => {
+    expect(typeof greatestProductOfDiagonals).toBe("function");
+  });
+
+  it("should return 1 (one) when all numbers of the arrays are 1", () => {
+    const matrix = [
+      [1, 1, 1, 1],
+      [1, 1, 1, 1],
+      [1, 1, 1, 1],
+      [1, 1, 1, 1],
+    ];
+    expect(greatestProductOfDiagonals(matrix)).toBe(1);
+  });
+
+  it("should return 16 when all the numbers of the arrays are 2", () => {
+    const matrix = [
+      [2, 2, 2, 2],
+      [2, 2, 2, 2],
+      [2, 2, 2, 2],
+      [2, 2, 2, 2],
+    ];
+    expect(greatestProductOfDiagonals(matrix)).toBe(16);
+  });
+
+  it("should return the correct product for diagonals from top-left to bottom-right", () => {
+    const matrix = [
+      [1, 1, 1, 1],
+      [2, 2, 2, 2],
+      [1, 1, 1, 1],
+      [5, 4, 3, 2],
+    ];
+    expect(greatestProductOfDiagonals(matrix)).toBe(10);
+  });
+
+  it("should return the correct product for diagonals from top-right to bottom-left", () => {
+    const matrix = [
+      [3, 1, 1, 1],
+      [1, 1, 1, 1],
+      [1, 1, 1, 1],
+      [1, 1, 1, 1],
+    ];
+    expect(greatestProductOfDiagonals(matrix)).toBe(3);
+  });
+
+  it("should handle matrices larger than 4x4", () => {
+    const matrix = [
+      [4, 3, 2, 1, 0],
+      [8, 7, 6, 5, 4],
+      [12, 11, 10, 9, 8],
+      [16, 15, 14, 13, 12],
+      [20, 19, 18, 17, 16]
+    ];
+    expect(greatestProductOfDiagonals(matrix)).toBe(58240);
+  });
+
+  it("should work correctly with negative numbers", () => {
+    const matrix = [
+      [-1, -1, -2, -3],
+      [-1, -1, -1, -1],
+      [-1, -1, -1, -1],
+      [-1, -1, -1, -1],
+    ];
+    expect(greatestProductOfDiagonals(matrix)).toBe(3);
+  });
+
+  it("should return 0 for a matrix smaller than 4x4", () => {
+    const matrix = [
+      [1, 2],
+      [3, 4],
+    ];
+    expect(greatestProductOfDiagonals(matrix)).toBe(0);
+  });
+});
\ No newline at end of file