jenkins-bot has submitted this change and it was merged. Change subject: ve.dm.Scalable: Create unit tests ......................................................................
ve.dm.Scalable: Create unit tests Bonus: Make isDimensionsObjectValid static because it is. Bug: T95411 Change-Id: I3c9bff32a996b876eb3c404845e28fbfd8837c33 --- M build/modules.json M src/dm/ve.dm.Scalable.js M src/ui/widgets/ve.ui.MediaSizeWidget.js A tests/dm/ve.dm.Scalable.test.js M tests/index.html 5 files changed, 175 insertions(+), 27 deletions(-) Approvals: Jforrester: Looks good to me, approved jenkins-bot: Verified diff --git a/build/modules.json b/build/modules.json index d7db279..5bea569 100644 --- a/build/modules.json +++ b/build/modules.json @@ -547,6 +547,7 @@ "tests/dm/ve.dm.SurfaceFragment.test.js", "tests/dm/ve.dm.ModelRegistry.test.js", "tests/dm/ve.dm.MetaList.test.js", + "tests/dm/ve.dm.Scalable.test.js", "tests/dm/selections/ve.dm.LinearSelection.test.js", "tests/dm/selections/ve.dm.NullSelection.test.js", "tests/dm/selections/ve.dm.TableSelection.test.js", diff --git a/src/dm/ve.dm.Scalable.js b/src/dm/ve.dm.Scalable.js index 41809fe..432396e 100644 --- a/src/dm/ve.dm.Scalable.js +++ b/src/dm/ve.dm.Scalable.js @@ -150,6 +150,27 @@ return dimensions; }; +/** + * Check if an object is a dimensions object. + * Make sure that if width or height are set, they are not 'undefined'. + * + * @param {Object} dimensions A dimensions object to test + * @return {boolean} Valid or invalid dimensions object + */ +ve.dm.Scalable.static.isDimensionsObjectValid = function ( dimensions ) { + if ( + dimensions && + !$.isEmptyObject( dimensions ) && + ( + dimensions.width !== undefined || + dimensions.height !== undefined + ) + ) { + return true; + } + return false; +}; + /* Methods */ /** @@ -208,7 +229,7 @@ */ ve.dm.Scalable.prototype.setCurrentDimensions = function ( dimensions ) { if ( - this.isDimensionsObjectValid( dimensions ) && + this.constructor.static.isDimensionsObjectValid( dimensions ) && !ve.compare( dimensions, this.getCurrentDimensions() ) ) { this.currentDimensions = ve.copy( dimensions ); @@ -231,7 +252,7 @@ */ ve.dm.Scalable.prototype.setOriginalDimensions = function ( dimensions ) { if ( - this.isDimensionsObjectValid( dimensions ) && + this.constructor.static.isDimensionsObjectValid( dimensions ) && !ve.compare( dimensions, this.getOriginalDimensions() ) ) { this.originalDimensions = ve.copy( dimensions ); @@ -252,7 +273,7 @@ */ ve.dm.Scalable.prototype.setDefaultDimensions = function ( dimensions ) { if ( - this.isDimensionsObjectValid( dimensions ) && + this.constructor.static.isDimensionsObjectValid( dimensions ) && !ve.compare( dimensions, this.getDefaultDimensions() ) ) { this.defaultDimensions = ve.copy( dimensions ); @@ -312,7 +333,7 @@ */ ve.dm.Scalable.prototype.setMinDimensions = function ( dimensions ) { if ( - this.isDimensionsObjectValid( dimensions ) && + this.constructor.static.isDimensionsObjectValid( dimensions ) && !ve.compare( dimensions, this.getMinDimensions() ) ) { this.minDimensions = ve.copy( dimensions ); @@ -329,7 +350,7 @@ */ ve.dm.Scalable.prototype.setMaxDimensions = function ( dimensions ) { if ( - this.isDimensionsObjectValid( dimensions ) && + this.constructor.static.isDimensionsObjectValid( dimensions ) && !ve.compare( dimensions, this.getMaxDimensions() ) ) { this.maxDimensions = ve.copy( dimensions ); @@ -595,25 +616,4 @@ ) ); return this.valid; -}; - -/** - * Check if an object is a dimensions object. - * Make sure that if width or height are set, they are not 'undefined'. - * - * @param {Object} dimensions A dimensions object to test - * @return {boolean} Valid or invalid dimensions object - */ -ve.dm.Scalable.prototype.isDimensionsObjectValid = function ( dimensions ) { - if ( - dimensions && - !$.isEmptyObject( dimensions ) && - ( - dimensions.width !== undefined || - dimensions.height !== undefined - ) - ) { - return true; - } - return false; }; diff --git a/src/ui/widgets/ve.ui.MediaSizeWidget.js b/src/ui/widgets/ve.ui.MediaSizeWidget.js index da16a9b..fcd5a0a 100644 --- a/src/ui/widgets/ve.ui.MediaSizeWidget.js +++ b/src/ui/widgets/ve.ui.MediaSizeWidget.js @@ -477,7 +477,7 @@ if ( // Update only if the dimensions object is valid - this.scalable.isDimensionsObjectValid( normalizedDimensions ) && + ve.dm.Scalable.static.isDimensionsObjectValid( normalizedDimensions ) && // And only if the dimensions object is not default !this.scalable.isDefault() ) { diff --git a/tests/dm/ve.dm.Scalable.test.js b/tests/dm/ve.dm.Scalable.test.js new file mode 100644 index 0000000..8e38d20 --- /dev/null +++ b/tests/dm/ve.dm.Scalable.test.js @@ -0,0 +1,146 @@ +/*! + * VisualEditor DataModel Scalable tests. + * + * @copyright 2011-2015 VisualEditor Team and others; see http://ve.mit-license.org + */ + +QUnit.module( 've.dm.Scalable' ); + +QUnit.test( 'construction/clone/getters/toggleDefault/clearers', 12, function ( assert ) { + var currentDimensions = { + width: 300, + height: 200 + }, + originalDimensions = { + width: 600, + height: 400 + }, + defaultDimensions = { + width: 150, + height: 50 + }, + minDimensions = { + width: 1, + height: 1 + }, + maxDimensions = { + width: 1200, + height: 800 + }, + scalable = new ve.dm.Scalable( { + currentDimensions: currentDimensions, + originalDimensions: originalDimensions, + defaultDimensions: defaultDimensions, + minDimensions: minDimensions, + maxDimensions: maxDimensions + } ), + clone = scalable.clone(); + + assert.deepEqual( scalable, clone, 'Clone is deepEqual' ); + assert.deepEqual( scalable.getCurrentDimensions(), currentDimensions, 'getCurrentDimensions' ); + assert.deepEqual( scalable.getOriginalDimensions(), originalDimensions, 'getOriginalDimensions' ); + assert.deepEqual( scalable.getDefaultDimensions(), defaultDimensions, 'getDefaultDimensions' ); + assert.deepEqual( scalable.getMinDimensions(), minDimensions, 'getMinDimensions' ); + assert.deepEqual( scalable.getMaxDimensions(), maxDimensions, 'getMaxDimensions' ); + assert.strictEqual( scalable.getRatio(), 1.5, 'getRatio' ); + + scalable.toggleDefault(); + assert.deepEqual( scalable.getCurrentDimensions(), scalable.getDefaultDimensions(), 'toggleDefault' ); + + scalable.clearDefaultDimensions(); + assert.strictEqual( scalable.getDefaultDimensions(), null, 'clearDefaultDimensions' ); + + scalable.clearOriginalDimensions(); + assert.strictEqual( scalable.getOriginalDimensions(), null, 'clearOriginalDimensions' ); + + scalable.clearMinDimensions(); + assert.strictEqual( scalable.getMinDimensions(), null, 'clearMinDimensions' ); + + scalable.clearMaxDimensions(); + assert.strictEqual( scalable.getMaxDimensions(), null, 'clearMaxDimensions' ); +} ); + +QUnit.test( 'getBoundedDimensions/getCurrentScale/isCurrentDimensionsValid/isTooSmall/isTooLarge', 16, function ( assert ) { + var currentDimensions = { + width: 300, + height: 200 + }, + originalDimensions = { + width: 600, + height: 400 + }, + minDimensions = { + width: 150, + height: 100 + }, + maxDimensions = { + width: 1200, + height: 800 + }, + scalable = new ve.dm.Scalable( { + currentDimensions: currentDimensions, + originalDimensions: originalDimensions, + minDimensions: minDimensions, + maxDimensions: maxDimensions + } ); + + assert.deepEqual( scalable.getBoundedDimensions( { width: 600, height: 600 } ), { width: 600, height: 400 }, 'getBoundedDimensions' ); + assert.deepEqual( scalable.getBoundedDimensions( { width: 2000, height: 2000 } ), { width: 1200, height: 800 }, 'getBoundedDimensions beyond maxDimensions' ); + assert.deepEqual( scalable.getBoundedDimensions( { width: 30, height: 30 } ), { width: 150, height: 100 }, 'getBoundedDimensions beyond minDimensions' ); + assert.deepEqual( scalable.getBoundedDimensions( { width: 448, height: 317 }, 10 ), { width: 450, height: 300 }, 'getBoundedDimensions snapped to 10px grid' ); + + scalable.fixedRatio = false; + + assert.strictEqual( scalable.getCurrentScale(), null, 'Scale is null when not fixed ratio' ); + + assert.deepEqual( scalable.getBoundedDimensions( { width: 600, height: 600 } ), { width: 600, height: 600 }, 'getBoundedDimensions, no fixed ratio' ); + assert.deepEqual( scalable.getBoundedDimensions( { width: 448, height: 317 }, 10 ), { width: 450, height: 320 }, 'getBoundedDimensions snapped to 10px grid, no fixed ratio' ); + + scalable.fixedRatio = true; + + assert.strictEqual( scalable.isCurrentDimensionsValid(), true, '300x200 are valid dimensions' ); + assert.strictEqual( scalable.getCurrentScale(), 0.5, '300x200 is scale of 0.5' ); + + scalable.setCurrentDimensions( { width: 1200, height: 800 } ); + assert.strictEqual( scalable.getCurrentScale(), 2, '1200x800 is scale of 2' ); + + scalable.setCurrentDimensions( { width: 1300, height: 810 } ); + assert.strictEqual( scalable.isCurrentDimensionsValid(), false, 'Too large dimensions are not valid' ); + assert.strictEqual( scalable.isTooSmall(), false, 'Too large dimensions are not too small' ); + assert.strictEqual( scalable.isTooLarge(), true, 'Too large dimensions are too large' ); + + scalable.setCurrentDimensions( { width: 30, height: 20 } ); + assert.strictEqual( scalable.isCurrentDimensionsValid(), false, 'Too small dimensions are not valid' ); + assert.strictEqual( scalable.isTooSmall(), true, 'Too large dimensions are too small' ); + assert.strictEqual( scalable.isTooLarge(), false, 'Too large dimensions are not too large' ); +} ); + +QUnit.test( 'isDimensionsObjectValid', function ( assert ) { + var i, cases = [ + { dimensions: null, expected: false, msg: 'Null' }, + { dimensions: { width: 200 }, expected: true, msg: 'Only width' }, + { dimensions: { height: 200 }, expected: true, msg: 'Only height' }, + { dimensions: {}, expected: false, msg: 'Empty object' }, + { dimensions: { width: undefined, height: undefined }, expected: false, msg: 'Explicity undefined' } + ]; + + QUnit.expect( cases.length ); + + for ( i = 0; i < cases.length; i++ ) { + assert.strictEqual( ve.dm.Scalable.static.isDimensionsObjectValid( cases[ i ].dimensions ), cases[ i ].expected, cases[ i ].msg ); + } +} ); + +QUnit.test( 'getDimensionsFromValue', function ( assert ) { + var i, cases = [ + { dimensions: { width: 200 }, ratio: 1, expected: { width: 200, height: 200 }, msg: 'Only width' }, + { dimensions: { height: 200 }, ratio: 2, expected: { width: 400, height: 200 }, msg: 'Only height' }, + { dimensions: { width: 200, height: '' }, ratio: 0.5, expected: { width: 200, height: 400 }, msg: 'Empty height' } + ]; + + QUnit.expect( cases.length ); + + for ( i = 0; i < cases.length; i++ ) { + assert.deepEqual( ve.dm.Scalable.static.getDimensionsFromValue( cases[ i ].dimensions, cases[ i ].ratio ), cases[ i ].expected, cases[ i ].msg ); + } +} ); diff --git a/tests/index.html b/tests/index.html index 11e4c4e..9a1ac8a 100644 --- a/tests/index.html +++ b/tests/index.html @@ -394,6 +394,7 @@ <script src="../tests/dm/ve.dm.SurfaceFragment.test.js"></script> <script src="../tests/dm/ve.dm.ModelRegistry.test.js"></script> <script src="../tests/dm/ve.dm.MetaList.test.js"></script> + <script src="../tests/dm/ve.dm.Scalable.test.js"></script> <script src="../tests/dm/selections/ve.dm.LinearSelection.test.js"></script> <script src="../tests/dm/selections/ve.dm.NullSelection.test.js"></script> <script src="../tests/dm/selections/ve.dm.TableSelection.test.js"></script> -- To view, visit https://gerrit.wikimedia.org/r/238148 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I3c9bff32a996b876eb3c404845e28fbfd8837c33 Gerrit-PatchSet: 2 Gerrit-Project: VisualEditor/VisualEditor Gerrit-Branch: master Gerrit-Owner: Esanders <esand...@wikimedia.org> Gerrit-Reviewer: Jforrester <jforres...@wikimedia.org> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits