From cb7494830411c3609ff06376091cb755806dd0ec Mon Sep 17 00:00:00 2001 From: Santhosh Thottingal Date: Sat, 23 Aug 2014 18:22:03 +0530 Subject: [PATCH] mediawiki.language: Fix infinite loop in commafy() when pattern has no grouping When the decimal part of the pattern has no grouping, commafy was entering into an infinite loop. Corrected the logic to handle this case. Also added qunit tests. Bug: 69835 Change-Id: I0f9e274411aead6a4e95402fd38c54ac6b76df53 --- .../mediawiki.language.numbers.js | 9 ++++----- .../resources/mediawiki/mediawiki.language.test.js | 13 +++++++++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/resources/src/mediawiki.language/mediawiki.language.numbers.js b/resources/src/mediawiki.language/mediawiki.language.numbers.js index 56fa0daf93..8bd2de9e39 100644 --- a/resources/src/mediawiki.language/mediawiki.language.numbers.js +++ b/resources/src/mediawiki.language/mediawiki.language.numbers.js @@ -34,7 +34,7 @@ } /** - * Efficiently replicate a string `n` times. + * Replicate a string 'n' times. * * @private * @param {string} str The string to replicate @@ -47,9 +47,8 @@ } var buf = []; - while (num) { + while ( num-- ) { buf.push( str ); - str += str; } return buf.join( '' ); } @@ -142,13 +141,13 @@ } for ( whole = valueParts[0]; whole; ) { - off = whole.length - groupSize; - + off = groupSize ? whole.length - groupSize : 0; pieces.push( ( off > 0 ) ? whole.substr( off ) : whole ); whole = ( off > 0 ) ? whole.slice( 0, off ) : ''; if ( groupSize2 ) { groupSize = groupSize2; + groupSize2 = null; } } valueParts[0] = pieces.reverse().join( options.group ); diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js index 3bfabe4c23..d43baeeb1f 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js @@ -17,6 +17,19 @@ assert.equal( mw.language.getData( 'en', 'invalidkey' ), undefined, 'Getter setter test for mw.language with invalid key' ); } ); + QUnit.test( 'mw.language.commafy test', 9, function ( assert ) { + // Number grouping patterns are as per http://cldr.unicode.org/translation/number-patterns + assert.equal( mw.language.commafy( 1234.567, '###0.#####' ), '1234.567', 'Pattern with no digit grouping separator defined' ); + assert.equal( mw.language.commafy( 123456789.567, '###0.#####' ), '123456789.567', 'Pattern with no digit grouping seperator defined, bigger decimal part' ); + assert.equal( mw.language.commafy( 0.567, '###0.#####' ), '0.567', 'Decimal part 0' ); + assert.equal( mw.language.commafy( '.567', '###0.#####' ), '0.567', 'Decimal part missing. replace with zero' ); + assert.equal( mw.language.commafy( 1234, '##,#0.#####' ), '12,34', 'Pattern with no fractional part' ); + assert.equal( mw.language.commafy( -1234.567, '###0.#####' ), '-1234.567', 'Negative number' ); + assert.equal( mw.language.commafy( -1234.567, '#,###.00' ), '-1,234.56', 'Fractional part bigger than pattern.' ); + assert.equal( mw.language.commafy( 123456789.567, '###,##0.00' ), '123,456,789.56', 'Decimal part as group of 3' ); + assert.equal( mw.language.commafy( 123456789.567, '###,###,#0.00' ), '1,234,567,89.56', 'Decimal part as group of 3 and last one 2' ); + } ); + function grammarTest( langCode, test ) { // The test works only if the content language is opt.language // because it requires [lang].js to be loaded. -- 2.20.1