diff --git a/index.js b/index.js index 51b791e..60a7c3b 100644 --- a/index.js +++ b/index.js @@ -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; diff --git a/test.js b/test.js index f8e2cba..446ec16 100644 --- a/test.js +++ b/test.js @@ -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); + }); + }); }); });