From 5c1e06c05a2ebbcb8c0583a967fd568f10fc2693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=82ne=20Mou?= Date: Mon, 2 Mar 2026 10:58:48 +0100 Subject: [PATCH] feat(maths): add type validation and comprehensive tests for isEven --- Maths/IsEven.js | 85 +++++++++++++++++++++++---------------- Maths/test/IsEven.test.js | 34 ++++++++++++++-- 2 files changed, 80 insertions(+), 39 deletions(-) diff --git a/Maths/IsEven.js b/Maths/IsEven.js index d12a4dd335..bec4ff6225 100644 --- a/Maths/IsEven.js +++ b/Maths/IsEven.js @@ -1,48 +1,63 @@ -/* - * Even Number: https://simple.wikipedia.org/wiki/Even_number +/** + * @license GPL-3.0 or later * - * function to check if number is even - * return true if number is even - * else false + * @description Checking if number is even */ /** - * @function isEven - * @description - Checking if number is even using divisibility by 2 + * @function isEven + * @description Checking if number is even + * + * If the division: number / 2 results in remainder being 0 + * the number is even, otherwise it's odd * - * If number is divisible by 2 i.e remainder = 0, then it is even - * therefore, the function will return true + * @param {number} number - Value to check + * @return {boolean} True if number is even else False * - * If number is not divisible by 2 i.e remainder != 0, then it is not even i.e odd - * therefore, the function will return false - * @param {number} number - * @return {boolean} + * @see https://simple.wikipedia.org/wiki/Even_number to get + * more details on even numbers */ -export const isEven = (number) => number % 2 === 0 +const isEven = (number) => { + if (typeof number !== 'number' || Number.isNaN(number)) + throw new TypeError('Argument is Not a Number') + + return Boolean(number % 2) === false +} /** - * @function isEvenBitwise - * @description - Checking if number is even using bitwise operator - * Bitwise AND (&) compares the bits of the 32 - * bit binary representations of the number and - * returns a number after comparing each bit: + * @function isEvenBitwise + * @description Checking if number is even using bitwise + * operation * - * 0 & 0 -> 0 - * 0 & 1 -> 0 - * 1 & 0 -> 0 - * 1 & 1 -> 1 + * Bitwise AND (&) compares the bits of the 32 bit binary + * representations of the number and returns a number after + * comparing each bit: + * 0 & 0 -> 0 + * 0 & 1 -> 0 + * 1 & 0 -> 0 + * 1 & 1 -> 1 + * For odd numbers, the LSB (Least Significant Bit) will be 1 + * and for even numbers, the LSB will be 0. As the number is + * compared to one, all other bits will become 0 + * 0 1 1 1 = 7 + * & & & & + * 0 0 0 1 = 1 + * ↓ ↓ ↓ ↓ + * 0 0 0 1 = odd since LSB is equal to 1 * - * For odd numbers, the last binary bit will be 1 - * and for even numbers, the last binary bit will - * be 0. + * @param {number} number - Value to check + * @return {boolean} True if number is even else False * - * As the number is compared with one, all the - * other bits except the last will become 0. The - * last bit will be 0 for even numbers and 1 for - * odd numbers, which is checked with the use - * of the equality operator. - * @param {number} number - * @returns {boolean} - * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_AND + * @see https://en.wikipedia.org/wiki/Bit_numbering to get + * details on LSB (Least Significant Bit) and + * https://en.wikipedia.org/wiki/Bitwise_operation#AND + * to get details on bitwise AND operator */ -export const isEvenBitwise = (number) => (number & 1) === 0 +const isEvenBitwise = (number) => { + if (typeof number !== 'number' || Number.isNaN(number)) + throw new TypeError('Argument is Not a Number') + + return Boolean(number & 1) === false +} + +export { isEven, isEvenBitwise } diff --git a/Maths/test/IsEven.test.js b/Maths/test/IsEven.test.js index 804b7bf481..436755430a 100644 --- a/Maths/test/IsEven.test.js +++ b/Maths/test/IsEven.test.js @@ -1,25 +1,51 @@ import { isEven, isEvenBitwise } from '../IsEven' describe('Testing isEven function', () => { - it('should return if the number is even or not', () => { + const randomNumber = Math.floor(Math.random() * 1999999) - 999999 + + it('will test a value which should be even: 4', () => { const isEvenNumber = isEven(4) expect(isEvenNumber).toBe(true) }) - it('should return if the number is even or not', () => { + it("will test a value which shouldn't be even: 7", () => { const isEvenNumber = isEven(7) expect(isEvenNumber).toBe(false) }) + + it(`will test a random value: ${randomNumber}`, () => { + const isEvenNumber = isEven(randomNumber) + expect(isEvenNumber).toBe(Boolean(randomNumber % 2) === false) + }) + + it('will test a TypeError for non-number inputs', () => { + expect(() => isEven('10')).toThrow(TypeError) + expect(() => isEven(null)).toThrow(TypeError) + expect(() => isEven(undefined)).toThrow(TypeError) + expect(() => isEven(NaN)).toThrow(TypeError) + }) }) describe('Testing isEvenBitwise function', () => { - it('should return if the number is even or not', () => { + const randomNumber = Math.floor(Math.random() * 1999999) - 999999 + + it('will test a value which should be even: 6', () => { const isEvenNumber = isEvenBitwise(6) expect(isEvenNumber).toBe(true) }) - it('should return if the number is even or not', () => { + it("will test a value which shouldn't be even: 3", () => { const isEvenNumber = isEvenBitwise(3) expect(isEvenNumber).toBe(false) }) + + it(`will test a random value: ${randomNumber}`, () => { + const isEvenNumber = isEvenBitwise(randomNumber) + expect(isEvenNumber).toBe(Boolean(randomNumber & 1) === false) + }) + + it('will test a TypeError for non-number inputs', () => { + expect(() => isEvenBitwise('10')).toThrow(TypeError) + expect(() => isEvenBitwise({})).toThrow(TypeError) + }) })