diff --git a/maths/area_of_various_shapes.ts b/maths/area_of_various_shapes.ts new file mode 100644 index 00000000..3680b8c4 --- /dev/null +++ b/maths/area_of_various_shapes.ts @@ -0,0 +1,123 @@ +/** + * @function areaOfSquare + * @description Calculate the area of a square. + * @param {number} side - The side of the square. + * @returns {number} - Area of the square. + * @throws {RangeError} - when side is 0 or negative. + * @see https://en.wikipedia.org/wiki/Square + * @example areaOfSquare(4) => 16 + */ +export function areaOfSquare(side: number): number{ + if(side<=0){ + throw new RangeError('Side must be non-zero positive value'); + } + return side*side; +} + +/** + * @function areaOfRectangle + * @description Calculate the area of a rectangle. + * @param {number} length - The length of the rectangle. + * @param {number} width - The width of the rectangle. + * @returns {number} - Area of the rectangle. + * @throws {RangeError} - when length or width is 0 or negative. + * @see https://en.wikipedia.org/wiki/Rectangle + * @example areaOfRectangle(4, 5) => 20 + */ +export function areaOfRectangle(length: number, width:number):number{ + if(length<=0 || width<=0){ + throw new RangeError('Length and width must be non-zero positive values'); + } + return length*width; +} + +/** + * @function areaOfCircle + * @description Calculate the area of a circle. + * @param {number} radius - The radius of the circle. + * @returns {number} - Area of the circle. + * @throws {RangeError} - when radius is 0 or negative. + * @see https://en.wikipedia.org/wiki/Circle + * @example areaOfCircle(7) => 153.93804002589985 + */ +export function areaOfCircle(radius:number):number{ + if(radius<=0){ + throw new RangeError('Radius must be non-zero positive value'); + } + return Math.PI*radius*radius; +} + +/** + * @function areaOfTriangle + * @description Calculate the area of a triangle. + * @param {number} base - the base of the triangle. + * @param {number} height - the height of the triangle. + * @returns {number} - Area of the triangle. + * @throws {RangeError} - when base or height is 0 or negative. + * @see https://en.wikipedia.org/wiki/Triangle + * @example areaOfTriangle(4, 5) => 10 + */ +export function areaOfTriangle(base: number, height:number): number{ + if(base<=0 || height<=0){ + throw new RangeError('Base and height must be non-zero positive values'); + } + + return 0.5*base*height; +} + +/** + * @function areaOfTrapezoid + * @description Calculate the area of a trapezoid. + * @param {number} a - the length of the first base of the trapezoid. + * @param {number} b - the length of the second base of the trapezoid. + * @param {number} height - the height of the trapezoid. + * @returns {number} - Area of the trapezoid. + * @throws {RangeError} - when a, b or height is 0 or negative. + * @see https://en.wikipedia.org/wiki/Trapezoid + * @example areaOfTrapezoid(4, 5, 6) => 27 + */ + +export function areaOfTrapezoid(a: number, b:number, height:number):number{ + if(a<=0 || b<=0 || height<=0){ + throw new RangeError('Bases and height must be non-zero positive values'); + } + + return 0.5*(a+b)*height; +} + +/** + * @function areaOfEclipse + * @description Calculate the area of an eclipse. + * @param {number} a - the length of the semi-major axis of the eclipse. + * @param {number} b - the length of the semi-minor axis of the eclipse. + * @returns {number} - Area of the eclipse. + * @throws {RangeError} - when a or b is 0 or negative. + * @see https://en.wikipedia.org/wiki/Ellipse + * @example areaOfEclipse(4, 5) => 62.83185307179586 + */ +export function areaOfEclipse(a: number, b:number):number{ + if(a<=0 || b<=0){ + throw new RangeError('Semi-major and semi-minor axes must be non-zero positive values'); + } + + return Math.PI*a*b; +} + + +/** + * @function areaOfParallelogram + * @description Calculate the area of a parallelogram. + * @param {number} base - the base of the parallelogram. + * @param {number} height - the height of the parallelogram. + * @returns {number} - Area of the parallelogram. + * @throws {RangeError} - when base or height is 0 or negative. + * @see https://en.wikipedia.org/wiki/Parallelogram + * @example areaOfParallelogram(4, 5) => 20 + */ +export function areaOfParallelogram(base: number, height:number): number{ + if(base<=0 || height<=0){ + throw new RangeError('Base and height must be non-zero positive values'); + } + + return base*height; +} \ No newline at end of file diff --git a/maths/test/area_of_various_shapes.test.ts b/maths/test/area_of_various_shapes.test.ts new file mode 100644 index 00000000..d8db2169 --- /dev/null +++ b/maths/test/area_of_various_shapes.test.ts @@ -0,0 +1,110 @@ +import { + areaOfSquare, + areaOfRectangle, + areaOfCircle, + areaOfTriangle, + areaOfTrapezoid, + areaOfEclipse, + areaOfParallelogram +} from '../area_of_various_shapes' + +describe('area of square', () => { + test.each([ + [4, 16], + [7, 49], + [10, 100] + ])(`areaOfSquare(%i) should return %d`, (side, expected) => { + expect(areaOfSquare(side)).toBe(expected) + }) + + test('should throw error on invalid input', () => { + expect(() => areaOfSquare(0)).toThrow(RangeError) + }) +}) + +describe('area of rectangle', () => { + test.each([ + [4, 5, 20], + [7, 10, 70], + [10, 15, 150] + ])(`areaOfRectangle(%d,%d) should return %d`, (length, width, expected) => { + expect(areaOfRectangle(length, width)).toBe(expected) + }) + + test('should throw error on invalid input', () => { + expect(() => areaOfRectangle(0, -1)).toThrow(RangeError) + }) +}) + +describe('area of circle', () => { + test.each([ + [7, Math.PI * 7 * 7], + [10, Math.PI * 10 * 10], + [15, Math.PI * 15 * 15] + ])(`areaOfCircle(%d) should return %d`, (radius, expected) => { + expect(areaOfCircle(radius)).toBe(expected) + }) + + test('Should throw error on invalid input', () => { + expect(() => areaOfCircle(-5)).toThrow(RangeError) + }) +}) + +describe('area of triangle', () => { + test.each([ + [4, 5, 10], + [7, 10, 35], + [10, 15, 75] + ])(`areaOfTriangle(%d,%d) should return %d`, (base, height, expected) => { + expect(areaOfTriangle(base, height)).toBe(expected) + }) + + test('Should throw error on invalid input', () => { + expect(() => areaOfTriangle(0, -1)).toThrow(RangeError) + }) +}) + +describe('area of trapezoid', () => { + test.each([ + [4, 5, 6, 27], + [5, 8, 4, 26], + [10, 20, 15, 225] + ])( + `areaOfTrapezoid(%d, %d, %d) should return %d`, + (a, b, height, expected) => { + expect(areaOfTrapezoid(a, b, height)).toBe(expected) + } + ) + + test('Should throw error on invalid input', () => { + expect(() => areaOfTrapezoid(2, 3, -5)).toThrow(RangeError) + }) +}) + +describe('area of eclipse', () => { + test.each([ + [4, 5, Math.PI * 4 * 5], + [7, 10, Math.PI * 7 * 10], + [10, 15, Math.PI * 10 * 15] + ])(`areaOfEclipse(%d, %d) should return %d`, (a, b, expected) => { + expect(areaOfEclipse(a, b)).toBe(expected) + }) + + test('Should throw error on invalid input', () => { + expect(() => areaOfEclipse(-5, 2)).toThrow(RangeError) + }) +}) + +describe('area of parallelogram', () => { + test.each([ + [4,5,20], + [7,10,70], + [10,15,150] + ])(`areaOfParallelogram(%d,%d) should return %d`, (base, height, expected) => { + expect(areaOfParallelogram(base, height)).toBe(expected) + }) + + test('Should throw error on invalid input', () => { + expect(() => areaOfParallelogram(0, -1)).toThrow(RangeError) + }) +}) \ No newline at end of file