diff --git a/lib/averageSpeed.js b/lib/averageSpeed.js new file mode 100644 index 00000000..dee5ce85 --- /dev/null +++ b/lib/averageSpeed.js @@ -0,0 +1,12 @@ +/** + Calculate average speend with distance and time + @param {number} distance + @param {number} time + @returns {number} average speed +*/ + +function averageSpeed(distance, time) { + throw new Error("this method is still a skeleton"); +} + +module.exports = averageSpeed; diff --git a/lib/getArrayElementCount.js b/lib/getArrayElementCount.js index 870810fa..608a60b9 100644 --- a/lib/getArrayElementCount.js +++ b/lib/getArrayElementCount.js @@ -2,12 +2,38 @@ Get count for all occurances of given element or array in an array If b is an array then it will count the occurrence of all elements in the given first array @param {array} a - @param {*} b + @param {array|number} b @returns {number} count value of element */ function getArrayElementCount(a, b) { - throw new Error("this method is still a skeleton"); + //throw new Error("this method is still a skeleton"); + // Verify args types + if (!Array.isArray(a)) { + throw new Error("First argument should be an array"); + } + + if (typeof b !== "number" && !Array.isArray(b)) { + throw new Error("Second argument should be number"); + } + + a.forEach(element => { + if(typeof element !== "number") { + throw new Error("First argument should be an array"); + } + }); + + if (Array.isArray(b)) { + b.forEach(element => { + if(typeof element !== "number") { + throw new Error("Second argument should be number"); + } + }); + } + var arr = Array.isArray(b) ? b : [ b ]; + + return arr.reduce((prev, curr) => + prev += a.filter(element => element === curr).length, 0); } module.exports = getArrayElementCount; diff --git a/test/averageSpeed.test.js b/test/averageSpeed.test.js new file mode 100644 index 00000000..71b90c3e --- /dev/null +++ b/test/averageSpeed.test.js @@ -0,0 +1,19 @@ +const { averageSpeed } = require("../lib"); + +describe("averageSpeed", () => { + it("should return averages", () => { + expect(averageSpeed(100, 1)).toEqual(100); + expect(averageSpeed(220, 2)).toEqual(110); + expect(averageSpeed(287, 3)).toBeCloseTo(95.666); + }); + + it("should throw error if first value is not a number", () => { + expect(() => averageSpeed("sdsds", 4)).toThrow("First argument should be a number"); + expect(() => averageSpeed([1], 4)).toThrow("First argument should be a number"); + }); + + it("should throw error if first value is not a number", () => { + expect(() => averageSpeed(100, false)).toThrow("Second argument should be a number"); + expect(() => averageSpeed(100, "dss")).toThrow("Second argument should be a number"); + }); +}); diff --git a/test/getArrayElementCount.test.js b/test/getArrayElementCount.test.js index fb9b97e7..18aebf72 100644 --- a/test/getArrayElementCount.test.js +++ b/test/getArrayElementCount.test.js @@ -11,12 +11,12 @@ describe("getArrayElementCount", () => { }); it("should throw error if first arg is not array", () => { - expect(getArrayElementCount("sdsds", 4)).toThrow("First argument should be an array"); - expect(getArrayElementCount(452755, 4)).toThrow("First argument should be an array"); + expect(() => getArrayElementCount("sdsds", 4)).toThrow("First argument should be an array"); + expect(() => getArrayElementCount(452755, 4)).toThrow("First argument should be an array"); }); it("should throw error if second arg is not present or is not a number or array", () => { - expect(getArrayElementCount([5, 7, 4, 6, 5, 4], false)).toThrow("Second argument should be number"); - expect(getArrayElementCount([3, 4, 56, 5, 6], "dss")).toThrow("Second argument should be number"); + expect(() => getArrayElementCount([5, 7, 4, 6, 5, 4], false)).toThrow("Second argument should be number"); + expect(() => getArrayElementCount([3, 4, 56, 5, 6], "dss")).toThrow("Second argument should be number"); }); });