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

Reply via email to