diff --git a/index.js b/index.js index 56045a0..cd11b3b 100644 --- a/index.js +++ b/index.js @@ -15,6 +15,7 @@ module.exports = Object.assign( require('./lib/isAscending.js'), require('./lib/isDescending.js'), require('./lib/isPrime.js'), + require('./lib/maximum.js'), require('./lib/median.js'), require('./lib/mode.js'), require('./lib/populationStandardDeviation.js'), diff --git a/lib/maximum.js b/lib/maximum.js new file mode 100644 index 0000000..d56fb88 --- /dev/null +++ b/lib/maximum.js @@ -0,0 +1,21 @@ +const { floatPrecise } = require('./floatPrecise'); + +const handleErrors = (params) => { + if (params.length === 0) throw new Error('Must provide one or more paramters'); + if (params.some(param => typeof param !== 'number')) { + throw new Error('One of your parameters does not evaluate to a number'); + } + // JS can only safely represent and compare integers + // between Number.MAX_SAFE_INTEGER and Number.MAX_SAFE_INTEGER + if (params.some(param => param > Number.MAX_SAFE_INTEGER || param < Number.MIN_SAFE_INTEGER)) { + throw new Error('Cannot reliably test primality of numbers larger than 9,007,199,254,740,991 or smaller than -9,007,199,254,740,991'); + } +}; + +exports.maximum = (...params) => { + handleErrors(params); + + const result = params.reduce((prev, cur) => (cur > prev ? cur : prev)); + + return floatPrecise(result); +}; diff --git a/spec/maximumSpec.js b/spec/maximumSpec.js new file mode 100644 index 0000000..232d5f8 --- /dev/null +++ b/spec/maximumSpec.js @@ -0,0 +1,24 @@ +const { maximum } = require('../lib/maximum'); + +describe('maximum', () => { + it('should return the maximum of all parameters, given that all parameters evaluate to numbers', () => { + const result = maximum(1, 5, -7, 15, 10); + expect(result).toBe(15); + }); + + it('should throw an error when no parameters are provided', () => { + expect(maximum).toThrow(); + }); + + it('should throw an error when at least one parameter does not evaluate to a number', () => { + expect(() => maximum('yo')).toThrow(); + }); + + it('should throw an error when at least one parameter evaluates to a number larger than Number.MAX_SAFE_INTEGER', () => { + expect(() => maximum(Number.MAX_SAFE_INTEGER + 1)).toThrow(); + }); + + it('should throw an error when at least one parameter evaluates to a number smaller than Number.MIN_SAFE_INTEGER', () => { + expect(() => maximum(Number.MIN_SAFE_INTEGER - 1)).toThrow(); + }); +});