From 9cc8f5dd07a3410e627b40cab1bc621347ad82c9 Mon Sep 17 00:00:00 2001 From: John-David Dalton Date: Sun, 27 Jul 2014 17:42:32 -0700 Subject: [PATCH] Add bizarro tests for `_.parseInt`. --- test/index.html | 26 ++++++++++++++++++++++++- test/test.js | 52 +++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 69 insertions(+), 9 deletions(-) diff --git a/test/index.html b/test/index.html index 8f5bfde82..4648cf5ab 100644 --- a/test/index.html +++ b/test/index.html @@ -55,7 +55,8 @@ fnToString = funcProto.toString, nativeString = fnToString.call(objectProto.toString), propertyIsEnumerable = objectProto.propertyIsEnumerable, - reToString = /toString/g; + reToString = /toString/g, + whitespace = ' \t\x0B\f\xA0\ufeff\n\r\u2028\u2029\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000'; function constant(value) { return function() { @@ -155,8 +156,27 @@ return Float64Array; }()); } + setProperty(window, '_parseInt', parseInt); + setProperty(window, 'parseInt', (function(_parseInt) { + var checkStr = whitespace + '08', + isFaked = _parseInt(checkStr) != 8, + reHexPrefix = /^0[xX]/, + reTrim = RegExp('^[' + whitespace + ']+|[' + whitespace + ']+$'); + + return function(value, radix) { + if (value == checkStr && !isFaked) { + isFaked = true; + return 0; + } + value = String(value == null ? '' : value).replace(reTrim, ''); + return _parseInt(value, +radix || (reHexPrefix.test(value) ? 16 : 10)); + }; + }(_parseInt))); + + // fake `WinRTError` setProperty(window, 'WinRTError', Error); + // fake free variable `global` setProperty(window, 'exports', window); setProperty(window, 'global', window); setProperty(window, 'module', {}); @@ -216,6 +236,10 @@ ArrayBuffer = _ArrayBuffer; } setProperty(window, '_ArrayBuffer', undefined); + + setProperty(window, 'parseInt', window._parseInt); + setProperty(window, '_parseInt', undefined); + setProperty(window, 'WinRTError', undefined); setProperty(window, 'exports', undefined); diff --git a/test/test.js b/test/test.js index 76a066b97..fb5005a49 100644 --- a/test/test.js +++ b/test/test.js @@ -422,6 +422,23 @@ return Float64Array; }())); } + var _parseInt = parseInt; + setProperty(root, 'parseInt', (function() { + var checkStr = whitespace + '08', + isFaked = _parseInt(checkStr) != 8, + reHexPrefix = /^0[xX]/, + reTrim = RegExp('^[' + whitespace + ']+|[' + whitespace + ']+$'); + + return function(value, radix) { + if (value == checkStr && !isFaked) { + isFaked = true; + return 0; + } + value = String(value == null ? '' : value).replace(reTrim, ''); + return _parseInt(value, +radix || (reHexPrefix.test(value) ? 16 : 10)); + }; + }())); + // fake `WinRTError` setProperty(root, 'WinRTError', Error); @@ -447,6 +464,7 @@ setProperty(Object, 'keys', _keys); setProperty(objectProto, 'hasOwnProperty', _hasOwnProperty); + setProperty(root, 'parseInt', _parseInt); if (_isFinite) { setProperty(Number, 'isFinite', _isFinite); @@ -7923,16 +7941,34 @@ strictEqual(_.parseInt('08', 10), 8); }); - test('should parse strings with leading whitespace (test in Chrome, Firefox, and Opera)', 8, function() { - strictEqual(_.parseInt(whitespace + '10'), 10); - strictEqual(_.parseInt(whitespace + '10', 10), 10); + test('should parse strings with leading whitespace (test in Chrome, Firefox, and Opera)', 2, function() { + var expected = [8, 8, 10, 10, 32, 32, 32, 32]; - strictEqual(_.parseInt(whitespace + '08'), 8); - strictEqual(_.parseInt(whitespace + '08', 10), 8); + _.times(2, function(index) { + var actual = [], + func = (index ? (lodashBizarro || {}) : _).parseInt; - _.each(['0x20', '0X20'], function(string) { - strictEqual(_.parseInt(whitespace + string), 32); - strictEqual(_.parseInt(whitespace + string, 16), 32); + if (func) { + _.times(2, function(otherIndex) { + var string = otherIndex ? '10' : '08'; + actual.push( + func(whitespace + string, 10), + func(whitespace + string) + ); + }); + + _.each(['0x20', '0X20'], function(string) { + actual.push( + func(whitespace + string), + func(whitespace + string, 16) + ); + }); + + deepEqual(actual, expected); + } + else { + skipTest(); + } }); });