Skip to content

Commit 5c1e06c

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

File tree

2 files changed

+80
-39
lines changed

2 files changed

+80
-39
lines changed

Maths/IsEven.js

Lines changed: 50 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,63 @@
1-
/*
2-
* Even Number: https://simple.wikipedia.org/wiki/Even_number
1+
/**
2+
* @license GPL-3.0 or later
33
*
4-
* function to check if number is even
5-
* return true if number is even
6-
* else false
4+
* @description Checking if number is even
75
*/
86

97
/**
10-
* @function isEven
11-
* @description - Checking if number is even using divisibility by 2
8+
* @function isEven
9+
* @description Checking if number is even
10+
*
11+
* If the division: number / 2 results in remainder being 0
12+
* the number is even, otherwise it's odd
1213
*
13-
* If number is divisible by 2 i.e remainder = 0, then it is even
14-
* therefore, the function will return true
14+
* @param {number} number - Value to check
15+
* @return {boolean} True if number is even else False
1516
*
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}
17+
* @see https://simple.wikipedia.org/wiki/Even_number to get
18+
* more details on even numbers
2019
*/
21-
export const isEven = (number) => number % 2 === 0
20+
const isEven = (number) => {
21+
if (typeof number !== 'number' || Number.isNaN(number))
22+
throw new TypeError('Argument is Not a Number')
23+
24+
return Boolean(number % 2) === false
25+
}
2226

2327
/**
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:
28+
* @function isEvenBitwise
29+
* @description Checking if number is even using bitwise
30+
* operation
2931
*
30-
* 0 & 0 -> 0
31-
* 0 & 1 -> 0
32-
* 1 & 0 -> 0
33-
* 1 & 1 -> 1
32+
* Bitwise AND (&) compares the bits of the 32 bit binary
33+
* representations of the number and returns a number after
34+
* comparing each bit:
35+
* 0 & 0 -> 0
36+
* 0 & 1 -> 0
37+
* 1 & 0 -> 0
38+
* 1 & 1 -> 1
39+
* For odd numbers, the LSB (Least Significant Bit) will be 1
40+
* and for even numbers, the LSB will be 0. As the number is
41+
* compared to one, all other bits will become 0
42+
* 0 1 1 1 = 7
43+
* & & & &
44+
* 0 0 0 1 = 1
45+
* ↓ ↓ ↓ ↓
46+
* 0 0 0 1 = odd since LSB is equal to 1
3447
*
35-
* For odd numbers, the last binary bit will be 1
36-
* and for even numbers, the last binary bit will
37-
* be 0.
48+
* @param {number} number - Value to check
49+
* @return {boolean} True if number is even else False
3850
*
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
51+
* @see https://en.wikipedia.org/wiki/Bit_numbering to get
52+
* details on LSB (Least Significant Bit) and
53+
* https://en.wikipedia.org/wiki/Bitwise_operation#AND
54+
* to get details on bitwise AND operator
4755
*/
48-
export const isEvenBitwise = (number) => (number & 1) === 0
56+
const isEvenBitwise = (number) => {
57+
if (typeof number !== 'number' || Number.isNaN(number))
58+
throw new TypeError('Argument is Not a Number')
59+
60+
return Boolean(number & 1) === false
61+
}
62+
63+
export { isEven, isEvenBitwise }

Maths/test/IsEven.test.js

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

33
describe('Testing isEven function', () => {
4-
it('should return if the number is even or not', () => {
4+
const randomNumber = Math.floor(Math.random() * 1999999) - 999999
5+
6+
it('will test a value which should be even: 4', () => {
57
const isEvenNumber = isEven(4)
68
expect(isEvenNumber).toBe(true)
79
})
810

9-
it('should return if the number is even or not', () => {
11+
it("will test a value which shouldn't be even: 7", () => {
1012
const isEvenNumber = isEven(7)
1113
expect(isEvenNumber).toBe(false)
1214
})
15+
16+
it(`will test a random value: ${randomNumber}`, () => {
17+
const isEvenNumber = isEven(randomNumber)
18+
expect(isEvenNumber).toBe(Boolean(randomNumber % 2) === false)
19+
})
20+
21+
it('will test a TypeError for non-number inputs', () => {
22+
expect(() => isEven('10')).toThrow(TypeError)
23+
expect(() => isEven(null)).toThrow(TypeError)
24+
expect(() => isEven(undefined)).toThrow(TypeError)
25+
expect(() => isEven(NaN)).toThrow(TypeError)
26+
})
1327
})
1428

1529
describe('Testing isEvenBitwise function', () => {
16-
it('should return if the number is even or not', () => {
30+
const randomNumber = Math.floor(Math.random() * 1999999) - 999999
31+
32+
it('will test a value which should be even: 6', () => {
1733
const isEvenNumber = isEvenBitwise(6)
1834
expect(isEvenNumber).toBe(true)
1935
})
2036

21-
it('should return if the number is even or not', () => {
37+
it("will test a value which shouldn't be even: 3", () => {
2238
const isEvenNumber = isEvenBitwise(3)
2339
expect(isEvenNumber).toBe(false)
2440
})
41+
42+
it(`will test a random value: ${randomNumber}`, () => {
43+
const isEvenNumber = isEvenBitwise(randomNumber)
44+
expect(isEvenNumber).toBe(Boolean(randomNumber & 1) === false)
45+
})
46+
47+
it('will test a TypeError for non-number inputs', () => {
48+
expect(() => isEvenBitwise('10')).toThrow(TypeError)
49+
expect(() => isEvenBitwise({})).toThrow(TypeError)
50+
})
2551
})

0 commit comments

Comments
 (0)