diff --git a/Conversions/VolumeConversion.js b/Conversions/VolumeConversion.js new file mode 100644 index 0000000000..844dd7e2cb --- /dev/null +++ b/Conversions/VolumeConversion.js @@ -0,0 +1,33 @@ +/** + * @function litresToGallons + * @description Converts volume from litres to US gallons. + * @param {number} litres - Volume in litres + * @returns {number} - Volume in US gallons + * @see https://en.wikipedia.org/wiki/Gallon + * @example litresToGallons(1) => 0.264172 + * @example litresToGallons(10) => 2.64172 + */ +const litresToGallons = (litres) => { + if (typeof litres !== 'number' || isNaN(litres)) { + throw new TypeError('Input must be a number') + } + return litres * 0.264172 +} + +/** + * @function gallonsToLitres + * @description Converts volume from US gallons to litres. + * @param {number} gallons - Volume in US gallons + * @returns {number} - Volume in litres + * @see https://en.wikipedia.org/wiki/Litre + * @example gallonsToLitres(1) => 3.78541 + * @example gallonsToLitres(10) => 37.8541 + */ +const gallonsToLitres = (gallons) => { + if (typeof gallons !== 'number' || isNaN(gallons)) { + throw new TypeError('Input must be a number') + } + return gallons * 3.78541 +} + +export { litresToGallons, gallonsToLitres } diff --git a/Conversions/test/VolumeConversion.test.js b/Conversions/test/VolumeConversion.test.js new file mode 100644 index 0000000000..61b0139fce --- /dev/null +++ b/Conversions/test/VolumeConversion.test.js @@ -0,0 +1,53 @@ +import { litresToGallons, gallonsToLitres } from '../VolumeConversion.js' + +describe('litresToGallons', () => { + test('litresToGallons(0) returns 0', () => { + expect(litresToGallons(0)).toBe(0) + }) + + test('litresToGallons(1) returns 0.264172', () => { + expect(litresToGallons(1)).toBeCloseTo(0.264172) + }) + + test('litresToGallons(10) returns 2.64172', () => { + expect(litresToGallons(10)).toBeCloseTo(2.64172) + }) + + test('litresToGallons(100) returns 26.4172', () => { + expect(litresToGallons(100)).toBeCloseTo(26.4172) + }) + + test('throws TypeError for non-number input', () => { + expect(() => litresToGallons('10')).toThrow(TypeError) + }) + + test('throws TypeError for NaN', () => { + expect(() => litresToGallons(NaN)).toThrow(TypeError) + }) +}) + +describe('gallonsToLitres', () => { + test('gallonsToLitres(0) returns 0', () => { + expect(gallonsToLitres(0)).toBe(0) + }) + + test('gallonsToLitres(1) returns 3.78541', () => { + expect(gallonsToLitres(1)).toBeCloseTo(3.78541) + }) + + test('gallonsToLitres(10) returns 37.8541', () => { + expect(gallonsToLitres(10)).toBeCloseTo(37.8541) + }) + + test('gallonsToLitres(5) returns 18.92705', () => { + expect(gallonsToLitres(5)).toBeCloseTo(18.92705) + }) + + test('throws TypeError for non-number input', () => { + expect(() => gallonsToLitres('10')).toThrow(TypeError) + }) + + test('throws TypeError for NaN', () => { + expect(() => gallonsToLitres(NaN)).toThrow(TypeError) + }) +})