diff --git a/Conversions/SpeedConversion.js b/Conversions/SpeedConversion.js new file mode 100644 index 0000000000..8a7ac2b8ed --- /dev/null +++ b/Conversions/SpeedConversion.js @@ -0,0 +1,33 @@ +/** + * @function kmphToMph + * @description Converts speed from kilometers per hour to miles per hour. + * @param {number} kmph - Speed in kilometers per hour + * @returns {number} - Speed in miles per hour + * @see https://en.wikipedia.org/wiki/Miles_per_hour + * @example kmphToMph(1) => 0.621371 + * @example kmphToMph(100) => 62.1371 + */ +const kmphToMph = (kmph) => { + if (typeof kmph !== 'number' || isNaN(kmph)) { + throw new TypeError('Input must be a number') + } + return kmph * 0.621371 +} + +/** + * @function mphToKmph + * @description Converts speed from miles per hour to kilometers per hour. + * @param {number} mph - Speed in miles per hour + * @returns {number} - Speed in kilometers per hour + * @see https://en.wikipedia.org/wiki/Kilometres_per_hour + * @example mphToKmph(1) => 1.60934 + * @example mphToKmph(60) => 96.5604 + */ +const mphToKmph = (mph) => { + if (typeof mph !== 'number' || isNaN(mph)) { + throw new TypeError('Input must be a number') + } + return mph * 1.60934 +} + +export { kmphToMph, mphToKmph } diff --git a/Conversions/test/SpeedConversion.test.js b/Conversions/test/SpeedConversion.test.js new file mode 100644 index 0000000000..2f8452c2ce --- /dev/null +++ b/Conversions/test/SpeedConversion.test.js @@ -0,0 +1,53 @@ +import { kmphToMph, mphToKmph } from '../SpeedConversion.js' + +describe('kmphToMph', () => { + test('kmphToMph(0) returns 0', () => { + expect(kmphToMph(0)).toBe(0) + }) + + test('kmphToMph(1) returns 0.621371', () => { + expect(kmphToMph(1)).toBeCloseTo(0.621371) + }) + + test('kmphToMph(100) returns 62.1371', () => { + expect(kmphToMph(100)).toBeCloseTo(62.1371) + }) + + test('kmphToMph(-60) works for negative values', () => { + expect(kmphToMph(-60)).toBeCloseTo(-37.28226) + }) + + test('throws TypeError for non-number input', () => { + expect(() => kmphToMph('100')).toThrow(TypeError) + }) + + test('throws TypeError for NaN', () => { + expect(() => kmphToMph(NaN)).toThrow(TypeError) + }) +}) + +describe('mphToKmph', () => { + test('mphToKmph(0) returns 0', () => { + expect(mphToKmph(0)).toBe(0) + }) + + test('mphToKmph(1) returns 1.60934', () => { + expect(mphToKmph(1)).toBeCloseTo(1.60934) + }) + + test('mphToKmph(60) returns 96.5604', () => { + expect(mphToKmph(60)).toBeCloseTo(96.5604) + }) + + test('mphToKmph(-30) works for negative values', () => { + expect(mphToKmph(-30)).toBeCloseTo(-48.2802) + }) + + test('throws TypeError for non-number input', () => { + expect(() => mphToKmph('60')).toThrow(TypeError) + }) + + test('throws TypeError for NaN', () => { + expect(() => mphToKmph(NaN)).toThrow(TypeError) + }) +})