Skip to content

Commit e3737fb

Browse files
feat(maths): add type validation and comprehensive tests for isEven
1 parent 08d8c6b commit e3737fb

File tree

2 files changed

+92
-42
lines changed

2 files changed

+92
-42
lines changed

Maths/IsEven.js

Lines changed: 57 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,67 @@
1-
/*
2-
* Even Number: https://simple.wikipedia.org/wiki/Even_number
1+
/**
2+
* @author Âne Mou - @sibalonecoding-code
3+
* Abhinav Pathak - @AbhinavXT
4+
* Fahim Faisaal - @fahimfaisaal
5+
*
6+
* @license GPL-3.0 or later
37
*
4-
* function to check if number is even
5-
* return true if number is even
6-
* else false
8+
* @description Checking if number is even
79
*/
810

911
/**
10-
* @function isEven
11-
* @description - Checking if number is even using divisibility by 2
12+
* @function isEven
13+
* @description Checking if number is even
14+
*
15+
* If the division: number / 2 results in remainder being 0
16+
* the number is even, otherwise it's odd
1217
*
13-
* If number is divisible by 2 i.e remainder = 0, then it is even
14-
* therefore, the function will return true
18+
* @param {number} number - Value to check
19+
* @return {boolean} True if number is even else False
1520
*
16-
* If number is not divisible by 2 i.e remainder != 0, then it is not even i.e odd
17-
* therefore, the function will return false
18-
* @param {number} number
19-
* @return {boolean}
21+
* @see https://simple.wikipedia.org/wiki/Even_number to get
22+
* more details on even numbers
2023
*/
21-
export const isEven = (number) => number % 2 === 0
24+
const isEven = (number) => {
25+
if (typeof number !== 'number' || Number.isNaN(number))
26+
throw new TypeError('Argument is Not a Number')
27+
28+
return number % 2 === 0
29+
}
2230

2331
/**
24-
* @function isEvenBitwise
25-
* @description - Checking if number is even using bitwise operator
26-
* Bitwise AND (&) compares the bits of the 32
27-
* bit binary representations of the number and
28-
* returns a number after comparing each bit:
29-
*
30-
* 0 & 0 -> 0
31-
* 0 & 1 -> 0
32-
* 1 & 0 -> 0
33-
* 1 & 1 -> 1
34-
*
35-
* For odd numbers, the last binary bit will be 1
36-
* and for even numbers, the last binary bit will
37-
* be 0.
38-
*
39-
* As the number is compared with one, all the
40-
* other bits except the last will become 0. The
41-
* last bit will be 0 for even numbers and 1 for
42-
* odd numbers, which is checked with the use
43-
* of the equality operator.
44-
* @param {number} number
45-
* @returns {boolean}
46-
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_AND
32+
* @function isEvenBitwise
33+
* @description Checking if number is even using bitwise
34+
* operation
35+
*
36+
* Bitwise AND (&) compares the bits of the 32 bit binary
37+
* representations of the number and returns a number after
38+
* comparing each bit:
39+
* 0 & 0 -> 0
40+
* 0 & 1 -> 0
41+
* 1 & 0 -> 0
42+
* 1 & 1 -> 1
43+
* For odd numbers, the LSB (Least Significant Bit) will be 1
44+
* and for even numbers, the LSB will be 0. As the number is
45+
* compared to one, all other bits will become 0
46+
* 0 1 1 1 = 7
47+
* & & & &
48+
* 0 0 0 1 = 1
49+
* ↓ ↓ ↓ ↓
50+
* 0 0 0 1 = odd since LSB is equal to 1
51+
*
52+
* @param {number} number - Value to check
53+
* @return {boolean} True if number is even else False
54+
*
55+
* @see https://en.wikipedia.org/wiki/Bit_numbering to get
56+
* details on LSB (Least Significant Bit) and
57+
* https://en.wikipedia.org/wiki/Bitwise_operation#AND
58+
* to get details on bitwise AND operator
4759
*/
48-
export const isEvenBitwise = (number) => (number & 1) === 0
60+
const isEvenBitwise = (number) => {
61+
if (typeof number !== 'number' || Number.isNaN(number))
62+
throw new TypeError('Argument is Not a Number')
63+
64+
return (number & 1) === 0
65+
}
66+
67+
export { isEven, isEvenBitwise }

Maths/test/IsEven.test.js

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,56 @@
11
import { isEven, isEvenBitwise } from '../IsEven'
22

3+
/**
4+
* Generate a random number between min_value
5+
* and max_value both include
6+
*/
7+
const minValue = -999999999
8+
const maxValue = 999999999
9+
const randomNumber =
10+
Math.floor(Math.random() * (maxValue - minValue + 1)) + minValue
11+
312
describe('Testing isEven function', () => {
4-
it('should return if the number is even or not', () => {
13+
it('will test a value which should be even: 4', () => {
514
const isEvenNumber = isEven(4)
615
expect(isEvenNumber).toBe(true)
716
})
817

9-
it('should return if the number is even or not', () => {
18+
it("will test a value which shouldn't be even: 7", () => {
1019
const isEvenNumber = isEven(7)
1120
expect(isEvenNumber).toBe(false)
1221
})
22+
23+
it(`will test a random value: ${randomNumber}`, () => {
24+
const isEvenNumber = isEven(randomNumber)
25+
expect(isEvenNumber).toBe(randomNumber % 2 === 0)
26+
})
27+
28+
it('will test a TypeError for non-number inputs', () => {
29+
expect(() => isEven('10')).toThrow(TypeError)
30+
expect(() => isEven(null)).toThrow(TypeError)
31+
expect(() => isEven(undefined)).toThrow(TypeError)
32+
expect(() => isEven(NaN)).toThrow(TypeError)
33+
})
1334
})
1435

1536
describe('Testing isEvenBitwise function', () => {
16-
it('should return if the number is even or not', () => {
37+
it('will test a value which should be even: 6', () => {
1738
const isEvenNumber = isEvenBitwise(6)
1839
expect(isEvenNumber).toBe(true)
1940
})
2041

21-
it('should return if the number is even or not', () => {
42+
it("will test a value which shouldn't be even: 3", () => {
2243
const isEvenNumber = isEvenBitwise(3)
2344
expect(isEvenNumber).toBe(false)
2445
})
46+
47+
it(`will test a random value: ${randomNumber}`, () => {
48+
const isEvenNumber = isEvenBitwise(randomNumber)
49+
expect(isEvenNumber).toBe((randomNumber & 1) === 0)
50+
})
51+
52+
it('will test a TypeError for non-number inputs', () => {
53+
expect(() => isEvenBitwise('10')).toThrow(TypeError)
54+
expect(() => isEvenBitwise({})).toThrow(TypeError)
55+
})
2556
})

0 commit comments

Comments
 (0)