Skip to content

Commit

Permalink
Fixing issue with unsafe numbers.
Browse files Browse the repository at this point in the history
This commit resolves #13.
  • Loading branch information
marlun78 committed Aug 9, 2018
1 parent 8184485 commit b7bed3e
Show file tree
Hide file tree
Showing 8 changed files with 98 additions and 4 deletions.
2 changes: 2 additions & 0 deletions gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ var REQUIRE_PATTERN = /((?:var |,)[^=]+=\s*require\([^\)]+\);?\n?)/g;
var EXPORT_PATTERN = /((?:module\.)?exports\s*=\s*[^,;]+;?\n?)/g;

var files = [
'./src/maxSafeInteger.js',
'./src/isFinite.js',
'./src/isSafeNumber.js',
'./src/makeOrdinal.js',
'./src/toOrdinal.js',
'./src/toWords.js',
Expand Down
30 changes: 30 additions & 0 deletions spec/isSafeNumberSpec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
'use strict';

var MAX_SAFE_INTEGER = require('../src/maxSafeInteger');
var isSafeNumber = require('../src/isSafeNumber');

describe('isSafeNumber', function() {
it('should return true if input is a number between -MAX_SAFE_INTEGER and MAX_SAFE_INTEGER (including)', function() {
expect(isSafeNumber(-MAX_SAFE_INTEGER)).toBe(true);
expect(isSafeNumber(-1)).toBe(true);
expect(isSafeNumber(0)).toBe(true);
expect(isSafeNumber(1)).toBe(true);
expect(isSafeNumber(MAX_SAFE_INTEGER)).toBe(true);
});
it('should return false if input is too large or too small', function() {
var unsafe = MAX_SAFE_INTEGER + 100;

expect(isSafeNumber(unsafe)).toBe(false);
expect(isSafeNumber(-unsafe)).toBe(false);
});
it('should return false if input is not a number', function() {
expect(isSafeNumber()).toBe(false);
expect(isSafeNumber(null)).toBe(false);
expect(isSafeNumber([])).toBe(false);
expect(isSafeNumber({})).toBe(false);
expect(isSafeNumber('')).toBe(false);
expect(isSafeNumber('x')).toBe(false);
expect(isSafeNumber(function() {})).toBe(false);
expect(isSafeNumber(NaN)).toBe(false);
});
});
13 changes: 13 additions & 0 deletions spec/toOrdinalSpec.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
'use strict';

var toOrdinal = typeof require !== 'undefined' ? require('../src/toOrdinal') : window.numberToWords.toOrdinal;
var MAX_SAFE_INTEGER = 9007199254740991;

describe('toOrdinal', function () {
var tests = [
Expand Down Expand Up @@ -36,4 +37,16 @@ describe('toOrdinal', function () {
}

tests.forEach(addTest);

it('should throw a RangeError if input is greater or lesser than MAX_SAFE_INTEGER', function() {
var unsafe = MAX_SAFE_INTEGER + 100;

expect(function() {
toOrdinal(unsafe);
}).toThrowError(/Input is not a safe number/);

expect(function() {
toOrdinal(-unsafe);
}).toThrowError(/Input is not a safe number/);
});
});
17 changes: 15 additions & 2 deletions spec/toWordsSpec.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
'use strict';

var MAX_SAFE_INTEGER = 9007199254740991;
var toWords = typeof require !== 'undefined' ? require('../src/toWords') : window.numberToWords.toWords;

describe('toWords', function () {
Expand Down Expand Up @@ -88,8 +89,8 @@ describe('toWords', function () {
expect: 'five quadrillion, five hundred fifty-five trillion, five hundred fifty-five billion, five hundred fifty-five million, five hundred fifty-five thousand, five hundred fifty-five'
},
{
input: 9007199254740992,
expect: 'nine quadrillion, seven trillion, one hundred ninety-nine billion, two hundred fifty-four million, seven hundred forty thousand, nine hundred ninety-two'
input: MAX_SAFE_INTEGER,
expect: 'nine quadrillion, seven trillion, one hundred ninety-nine billion, two hundred fifty-four million, seven hundred forty thousand, nine hundred ninety-one'
}
];

Expand All @@ -111,6 +112,18 @@ describe('toWords', function () {
expect(toWords(30, true)).toEqual('thirtieth');
expect(toWords(123, true)).toEqual('one hundred twenty-third');
});

it('should throw a RangeError if input is greater or lesser than MAX_SAFE_INTEGER', function() {
var unsafe = MAX_SAFE_INTEGER + 100;

expect(function() {
toWords(unsafe);
}).toThrowError(/Input is not a safe number/);

expect(function() {
toWords(-unsafe);
}).toThrowError(/Input is not a safe number/);
});
});

function formatNumber(number) {
Expand Down
9 changes: 9 additions & 0 deletions src/isSafeNumber.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
'use strict';

var MAX_SAFE_INTEGER = require('./maxSafeInteger');

function isSafeNumber(value) {
return typeof value === 'number' && Math.abs(value) <= MAX_SAFE_INTEGER;
}

module.exports = isSafeNumber;
5 changes: 5 additions & 0 deletions src/maxSafeInteger.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
'use strict';

var MAX_SAFE_INTEGER = 9007199254740991;

module.exports = MAX_SAFE_INTEGER;
13 changes: 12 additions & 1 deletion src/toOrdinal.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
'use strict';

var isFinite = require('./isFinite');
var isSafeNumber = require('./isSafeNumber');

/**
* Converts an integer into a string with an ordinal postfix.
Expand All @@ -11,7 +12,17 @@ var isFinite = require('./isFinite');
*/
function toOrdinal(number) {
var num = parseInt(number, 10);
if (!isFinite(num)) throw new TypeError('Not a finite number: ' + number + ' (' + typeof number + ')');

if (!isFinite(num)) {
throw new TypeError(
'Not a finite number: ' + number + ' (' + typeof number + ')'
);
}
if (!isSafeNumber(num)) {
throw new RangeError(
'Input is not a safe number, it’s either too large or too small.'
);
}
var str = String(num);
var lastTwoDigits = Math.abs(num % 100);
var betweenElevenAndThirteen = lastTwoDigits >= 11 && lastTwoDigits <= 13;
Expand Down
13 changes: 12 additions & 1 deletion src/toWords.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

var makeOrdinal = require('./makeOrdinal');
var isFinite = require('./isFinite');
var isSafeNumber = require('./isSafeNumber');

var TEN = 10;
var ONE_HUNDRED = 100;
Expand Down Expand Up @@ -32,7 +33,17 @@ var TENTHS_LESS_THAN_HUNDRED = [
function toWords(number, asOrdinal) {
var words;
var num = parseInt(number, 10);
if (!isFinite(num)) throw new TypeError('Not a finite number: ' + number + ' (' + typeof number + ')');

if (!isFinite(num)) {
throw new TypeError(
'Not a finite number: ' + number + ' (' + typeof number + ')'
);
}
if (!isSafeNumber(num)) {
throw new RangeError(
'Input is not a safe number, it’s either too large or too small.'
);
}
words = generateWords(num);
return asOrdinal ? makeOrdinal(words) : words;
}
Expand Down

0 comments on commit b7bed3e

Please sign in to comment.