Skip to content

Commit

Permalink
Merge pull request #24 from Turistforeningen/feat/strict-number-parsing
Browse files Browse the repository at this point in the history
Stricter string to number parsing
  • Loading branch information
Starefossen committed May 10, 2016
2 parents 11025e1 + 91bc7e9 commit 75c7c5e
Show file tree
Hide file tree
Showing 2 changed files with 125 additions and 29 deletions.
3 changes: 2 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,8 @@ module.exports.prototype.parseStringVal = function(string) {
return true;
} else if (this.string.toBoolean && string.toLowerCase() === 'false') {
return false;
} else if (this.string.toNumber && !isNaN(parseFloat(string, 10))) {
} else if (this.string.toNumber && !isNaN(parseInt(string, 10)) &&
(+string - +string + 1) >= 0) {
return parseFloat(string, 10);
} else {
return string;
Expand Down
151 changes: 123 additions & 28 deletions test.js
Original file line number Diff line number Diff line change
Expand Up @@ -101,47 +101,142 @@ describe('customAfter()', function() {
});

describe('parseStringVal()', function() {
it('returns boolean true for "true" string', function() {
assert.equal(qs.parseStringVal('true'), true);
});
describe('true', function() {
[
'true',
'TrUe',
'TRUE'
].forEach(function(val) {
it('returns true for "'+ val + '" string', function() {
assert.strictEqual(qs.parseStringVal(val), true);
});

it('returns string "true" when boolean parsing is disabled', function() {
qs.string.toBoolean = false;
assert.equal(qs.parseStringVal('true'), 'true');
it('returns "'+ val + '" for "'+ val + '" when !toBoolean', function() {
qs.string.toBoolean = false;
assert.strictEqual(qs.parseStringVal(val), val);
});
});
});

it('returns boolean false for "flase" string', function() {
assert.equal(qs.parseStringVal('false'), false);
});
describe('false', function() {
[
'false',
'FaLsE',
'FALSE'
].forEach(function(val) {
it('returns false for "'+ val + '" string', function() {
assert.strictEqual(qs.parseStringVal(val), false);
});

it('returns string "false" when boolean parsing is disabled', function() {
qs.string.toBoolean = false;
assert.equal(qs.parseStringVal('false'), 'false');
it('returns "'+ val + '" for "'+ val + '" when !toBoolean', function() {
qs.string.toBoolean = false;
assert.strictEqual(qs.parseStringVal(val), val);
});
});
});

it('returns number for parseable integer', function() {
assert.equal(qs.parseStringVal('100'), 100);
});
describe('integers', function() {
[
'0',
'1',
'100',
'000100',

it('returns string number when number parsing is disabled', function() {
qs.string.toNumber = false;
assert.equal(qs.parseStringVal('100'), '100');
});
'+0',
'+1',
'+100',
'+000100',

it('returns number for zero padded parseable integer', function() {
assert.equal(qs.parseStringVal('000100'), 100);
});
'-0',
'-1',
'-100',
'-000100',

' 0 ',
' 1 ',
' 100 ',
' 000100 ',
].forEach(function(val) {
var ret = parseInt(val, 10);

it('returns number for parseable float', function() {
assert.equal(qs.parseStringVal('10.123'), 10.123);
it('returns '+ ret +' for "'+ val + '"', function() {
assert.strictEqual(qs.parseStringVal(val), ret);
assert.notStrictEqual(qs.parseStringVal(val), NaN);
});

it('returns "'+ val + '" for "'+ val + '" when !toNumber', function() {
qs.string.toNumber = false;
assert.strictEqual(qs.parseStringVal(val), val);
});
});
});

it('returns number for zero padded parseable float', function() {
assert.equal(qs.parseStringVal('00010.123'), 10.123);
describe('floats', function() {
[
'0.0',
'1.1',
'100.99',
'000100.0099',

'+0.0',
'+1.1',
'+100.99',
'+000100.0099',

'-0.0',
'-1.1',
'-100.99',
'-000100.0099',

' 0.0 ',
' 1.1 ',
' 100.99 ',
' 000100.0099 ',
].forEach(function(val) {
var ret = parseFloat(val, 10);

it('returns '+ ret + ' for "'+ val + '"', function() {
assert.strictEqual(qs.parseStringVal(val), parseFloat(val, 10));
assert.notStrictEqual(qs.parseStringVal(val), NaN);
});

it('returns "' + val + '" for "'+ val + '" when !toNumber', function() {
qs.string.toNumber = false;
assert.strictEqual(qs.parseStringVal(val), val);
});
});
});

it('returns string for empty string', function() {
assert.equal(qs.parseStringVal(''), '');
describe('strings', function() {
[
'',

' ',
' ',
' ',

'+',
'-',
' + ',
' - ',

'a',
'ab',
'abc',

' a ',
' ab ',
' abc ',

'abc123abc',
'abc123',
'123abc',
'123abc123',
].forEach(function(val) {
it('returns "'+ val + '" for "'+ val + '"', function() {
assert.strictEqual(qs.parseStringVal(val), val);
});
});
});
});

Expand Down

0 comments on commit 75c7c5e

Please sign in to comment.