diff --git a/core/bubble.js b/core/bubble.js index 7922230c9..5ec9eca47 100644 --- a/core/bubble.js +++ b/core/bubble.js @@ -555,8 +555,8 @@ Blockly.Bubble.prototype.getOverlap_ = function(relativeMin, viewMetrics) { * Calculate what the optimal horizontal position of the top-left corner of the * bubble is (relative to the anchor point) so that the most area of the * bubble is shown. - * @param {!Blockly.MetricsManager.ContainerRegion} viewMetrics The view metrics of the - * workspace the bubble will appear in. + * @param {!Blockly.MetricsManager.ContainerRegion} viewMetrics The view metrics + * of the workspace the bubble will appear in. * @return {number} The optimal horizontal position of the top-left corner * of the bubble. * @private @@ -613,8 +613,8 @@ Blockly.Bubble.prototype.getOptimalRelativeLeft_ = function(viewMetrics) { * Calculate what the optimal vertical position of the top-left corner of * the bubble is (relative to the anchor point) so that the most area of the * bubble is shown. - * @param {!Blockly.MetricsManager.ContainerRegion} viewMetrics The view metrics of the - * workspace the bubble will appear in. + * @param {!Blockly.MetricsManager.ContainerRegion} viewMetrics The view metrics + * of the workspace the bubble will appear in. * @return {number} The optimal vertical position of the top-left corner * of the bubble. * @private diff --git a/core/interfaces/i_metrics_manager.js b/core/interfaces/i_metrics_manager.js index 5cda4bca7..35b3228c8 100644 --- a/core/interfaces/i_metrics_manager.js +++ b/core/interfaces/i_metrics_manager.js @@ -57,7 +57,8 @@ Blockly.IMetricsManager.prototype.getContentDimensionsExact_; * coordinates. Returns 0 for the width and height if the workspace has a * category toolbox instead of a simple toolbox. * @param {boolean=} opt_own Whether to only return the workspace's own flyout. - * @return {!Blockly.utils.Size} The width and height of the flyout. + * @return {!Blockly.MetricsManager.ToolboxMetrics} The width and height of the + * flyout. * @public */ Blockly.IMetricsManager.prototype.getFlyoutMetrics; @@ -113,11 +114,11 @@ Blockly.IMetricsManager.prototype.getViewMetrics; * * If the workspace does not have a fixed width and height then it is the * metrics of the area that content can be placed. + * @param {boolean=} opt_getWorkspaceCoordinates True to get the content metrics + * in workspace coordinates, false to get them in pixel coordinates. * @param {!Blockly.MetricsManager.ContainerRegion=} opt_viewMetrics The view * metrics if they have been previously computed. Passing in null may cause * the view metrics to be computed again, if it is needed. - * @param {boolean=} opt_getWorkspaceCoordinates True to get the content metrics - * in workspace coordinates, false to get them in pixel coordinates. * @return {!Blockly.MetricsManager.ContainerRegion} The * metrics for the content container. * @public diff --git a/core/metrics_manager.js b/core/metrics_manager.js index 004128cbb..a22033b23 100644 --- a/core/metrics_manager.js +++ b/core/metrics_manager.js @@ -153,14 +153,17 @@ Blockly.MetricsManager.prototype.getContentDimensionsExact_ = function() { * coordinates. Returns 0 for the width and height if the workspace has a * category toolbox instead of a simple toolbox. * @param {boolean=} opt_own Whether to only return the workspace's own flyout. - * @return {!Blockly.utils.Size} The width and height of the flyout. + * @return {!Blockly.MetricsManager.ToolboxMetrics} The width and height of the + * flyout. * @public */ Blockly.MetricsManager.prototype.getFlyoutMetrics = function(opt_own) { - var flyoutDimensions = - this.getDimensionsPx_(this.workspace_.getFlyout(opt_own)); - return new Blockly.utils.Size( - flyoutDimensions.width, flyoutDimensions.height); + var flyoutDimensions = this.getDimensionsPx_(this.workspace_.getFlyout(opt_own)); + return { + width: flyoutDimensions.width, + height: flyoutDimensions.height, + position: this.workspace_.toolboxPosition + }; }; /** @@ -206,8 +209,9 @@ Blockly.MetricsManager.prototype.getAbsoluteMetrics = function() { var toolboxMetrics = this.getToolboxMetrics(); var flyoutMetrics = this.getFlyoutMetrics(true); var doesToolboxExist = !!this.workspace_.getToolbox(); - var toolboxPosition = this.workspace_.toolboxPosition; var doesFlyoutExist = !!this.workspace_.getFlyout(true); + var toolboxPosition = + doesToolboxExist ? toolboxMetrics.position : flyoutMetrics.position; if (doesToolboxExist && toolboxPosition == Blockly.TOOLBOX_AT_LEFT) { absoluteLeft = toolboxMetrics.width; @@ -243,7 +247,9 @@ Blockly.MetricsManager.prototype.getViewMetrics = function( var svgMetrics = this.getSvgMetrics(); var toolboxMetrics = this.getToolboxMetrics(); var flyoutMetrics = this.getFlyoutMetrics(true); - var toolboxPosition = this.workspace_.toolboxPosition; + var doesToolboxExist = !!this.workspace_.getToolbox(); + var toolboxPosition = + doesToolboxExist ? toolboxMetrics.position : flyoutMetrics.position; if (this.workspace_.getToolbox()) { if (toolboxPosition == Blockly.TOOLBOX_AT_TOP || @@ -282,17 +288,17 @@ Blockly.MetricsManager.prototype.getViewMetrics = function( * metrics of the area that content can be placed. This area is computed by * getting the rectangle around the top bounded elements on the workspace and * adding padding to all sides. - * @param {!Blockly.MetricsManager.ContainerRegion=} opt_viewMetrics The view - * metrics if they have been previously computed. Passing in null may cause - * the view metrics to be computed again, if it is needed. * @param {boolean=} opt_getWorkspaceCoordinates True to get the content metrics * in workspace coordinates, false to get them in pixel coordinates. + * @param {!Blockly.MetricsManager.ContainerRegion=} opt_viewMetrics The view + * metrics if they have been previously computed. Not passing in view + * metrics may cause them to be computed again. * @return {!Blockly.MetricsManager.ContainerRegion} The * metrics for the content container. * @public */ Blockly.MetricsManager.prototype.getContentMetrics = function( - opt_viewMetrics, opt_getWorkspaceCoordinates) { + opt_getWorkspaceCoordinates, opt_viewMetrics) { var scale = opt_getWorkspaceCoordinates ? this.workspace_.scale : 1; var contentDimensions = null; if (this.workspace_.isContentBounded()) { @@ -347,7 +353,7 @@ Blockly.MetricsManager.prototype.getMetrics = function() { var svgMetrics = this.getSvgMetrics(); var absoluteMetrics = this.getAbsoluteMetrics(); var viewMetrics = this.getViewMetrics(); - var contentMetrics = this.getContentMetrics(viewMetrics); + var contentMetrics = this.getContentMetrics(false, viewMetrics); return { contentHeight: contentMetrics.height, diff --git a/tests/mocha/metrics_test.js b/tests/mocha/metrics_test.js index 016210322..68e50f3ea 100644 --- a/tests/mocha/metrics_test.js +++ b/tests/mocha/metrics_test.js @@ -1,16 +1,18 @@ /** * @license - * Copyright 2019 Google LLC + * Copyright 2021 Google LLC * SPDX-License-Identifier: Apache-2.0 */ /** - * @fileoverview Metrics tests. - * @author samelh@google.com (Sam El-Husseini) + * @fileoverview Test for the metrics manager. + * @author aschmiedt@google.com (Abby Schmiedt) */ 'use strict'; suite('Metrics', function() { + var SCROLL_X = 10; + var SCROLL_Y = 10; function assertDimensionsMatch(toCheck, left, top, width, height) { chai.assert.equal(top, toCheck.top, 'Top did not match.'); chai.assert.equal(left, toCheck.left, 'Left did not match.'); @@ -23,14 +25,14 @@ suite('Metrics', function() { function makeMockWs(scale, x, y, width, height) { return { getBlocksBoundingBox: function() { - return { - top: y, - bottom: y + height, - left: x, - right: x + width - }; + return {top: y, bottom: y + height, left: x, right: x + width}; }, - scale: scale + getToolbox: function() {}, + getFlyout: function() {}, + scale: scale, + scrollX: SCROLL_X, + scrollY: SCROLL_Y, + isContentBounded: function() {} }; } @@ -41,85 +43,307 @@ suite('Metrics', function() { sharedTestTeardown.call(this); }); - test('GetContentDimensionsExact - empty', function() { - var ws = makeMockWs(1, 0, 0, 0, 0); - var metricsManager = new Blockly.MetricsManager(ws); - var defaultZoom = metricsManager.getContentDimensionsExact_(ws); - assertDimensionsMatch(defaultZoom, 0, 0, 0, 0); + suite('getContentDimensionsExact_', function() { + test('Empty', function() { + var ws = makeMockWs(1, 0, 0, 0, 0); + var metricsManager = new Blockly.MetricsManager(ws); + var defaultZoom = metricsManager.getContentDimensionsExact_(ws); + assertDimensionsMatch(defaultZoom, 0, 0, 0, 0); + }); + test('Empty zoom in', function() { + var ws = makeMockWs(2, 0, 0, 0, 0); + var metricsManager = new Blockly.MetricsManager(ws); + var zoomIn = metricsManager.getContentDimensionsExact_(ws); + assertDimensionsMatch(zoomIn, 0, 0, 0, 0); + }); + test('Empty zoom out', function() { + var ws = makeMockWs(.5, 0, 0, 0, 0); + var metricsManager = new Blockly.MetricsManager(ws); + var zoomOut = metricsManager.getContentDimensionsExact_(ws); + assertDimensionsMatch(zoomOut, 0, 0, 0, 0); + }); + test('Non empty at origin', function() { + var ws = makeMockWs(1, 0, 0, 100, 100); + var metricsManager = new Blockly.MetricsManager(ws); + var defaultZoom = metricsManager.getContentDimensionsExact_(ws); + // Pixel and ws units are the same at default zoom. + assertDimensionsMatch(defaultZoom, 0, 0, 100, 100); + }); + test('Non empty at origin zoom in', function() { + var ws = makeMockWs(2, 0, 0, 100, 100); + var metricsManager = new Blockly.MetricsManager(ws); + var zoomIn = metricsManager.getContentDimensionsExact_(ws); + // 1 ws unit = 2 pixels at this zoom level. + assertDimensionsMatch(zoomIn, 0, 0, 200, 200); + }); + test('Non empty at origin zoom out', function() { + var ws = makeMockWs(.5, 0, 0, 100, 100); + var metricsManager = new Blockly.MetricsManager(ws); + var zoomOut = metricsManager.getContentDimensionsExact_(ws); + // 1 ws unit = 0.5 pixels at this zoom level. + assertDimensionsMatch(zoomOut, 0, 0, 50, 50); + }); + test('Non empty positive origin', function() { + var ws = makeMockWs(1, 10, 10, 100, 100); + var metricsManager = new Blockly.MetricsManager(ws); + var defaultZoom = metricsManager.getContentDimensionsExact_(ws); + // Pixel and ws units are the same at default zoom. + assertDimensionsMatch(defaultZoom, 10, 10, 100, 100); + }); + test('Non empty positive origin zoom in', function() { + var ws = makeMockWs(2, 10, 10, 100, 100); + var metricsManager = new Blockly.MetricsManager(ws); + var zoomIn = metricsManager.getContentDimensionsExact_(ws); + // 1 ws unit = 2 pixels at this zoom level. + assertDimensionsMatch(zoomIn, 20, 20, 200, 200); + }); + test('Non empty positive origin zoom out', function() { + var ws = makeMockWs(.5, 10, 10, 100, 100); + var metricsManager = new Blockly.MetricsManager(ws); + var zoomOut = metricsManager.getContentDimensionsExact_(ws); + // 1 ws unit = 0.5 pixels at this zoom level. + assertDimensionsMatch(zoomOut, 5, 5, 50, 50); + }); + test('Non empty negative origin', function() { + var ws = makeMockWs(1, -10, -10, 100, 100); + var metricsManager = new Blockly.MetricsManager(ws); + var defaultZoom = metricsManager.getContentDimensionsExact_(ws); + // Pixel and ws units are the same at default zoom. + assertDimensionsMatch(defaultZoom, -10, -10, 100, 100); + }); + test('Non empty negative origin zoom in', function() { + var ws = makeMockWs(2, -10, -10, 100, 100); + var metricsManager = new Blockly.MetricsManager(ws); + var zoomIn = metricsManager.getContentDimensionsExact_(ws); + // 1 ws unit = 2 pixels at this zoom level. + assertDimensionsMatch(zoomIn, -20, -20, 200, 200); + }); + test('Non empty negative origin zoom out', function() { + var ws = makeMockWs(.5, -10, -10, 100, 100); + var metricsManager = new Blockly.MetricsManager(ws); + var zoomOut = metricsManager.getContentDimensionsExact_(ws); + // 1 ws unit = 0.5 pixels at this zoom level. + assertDimensionsMatch(zoomOut, -5, -5, 50, 50); + }); }); - test('GetContentDimensionsExact - empty zoom in', function() { - var ws = makeMockWs(2, 0, 0, 0, 0); - var metricsManager = new Blockly.MetricsManager(ws); - var zoomIn = metricsManager.getContentDimensionsExact_(ws); - assertDimensionsMatch(zoomIn, 0, 0, 0, 0); + + suite('getContentDimensionsBounded_', function() { + setup(function() { + this.ws = makeMockWs(1, 0, 0, 0, 0); + this.metricsManager = new Blockly.MetricsManager(this.ws); + this.contentDimensionsStub = + sinon.stub(this.metricsManager, 'getContentDimensionsExact_'); + }); + test('Empty workspace', function() { + // The location of the viewport. + var mockViewMetrics = {top: 0, left: 0, width: 200, height: 200}; + // The bounding box around the blocks on the screen. + var mockContentDimensions = {top: 0, left: 0, width: 0, height: 0}; + this.contentDimensionsStub.returns(mockContentDimensions); + + var contentMetrics = + this.metricsManager.getContentDimensionsBounded_(mockViewMetrics); + + // Should add half the view width to all sides. + assertDimensionsMatch(contentMetrics, -200, -200, 400, 400); + }); + test('Non empty workspace', function() { + // The location of the viewport. + var mockViewMetrics = {top: 0, left: 0, width: 200, height: 200}; + // The bounding box around the blocks on the screen. + var mockContentDimensions = {top: 100, left: 100, width: 50, height: 50}; + this.contentDimensionsStub.returns(mockContentDimensions); + + var contentMetrics = + this.metricsManager.getContentDimensionsBounded_(mockViewMetrics); + + // Should add half of the view width to all sides. + assertDimensionsMatch(contentMetrics, -50, -50, 350, 350); + }); }); - test('GetContentDimensionsExact - empty zoom out', function() { - var ws = makeMockWs(.5, 0, 0, 0, 0); - var metricsManager = new Blockly.MetricsManager(ws); - var zoomOut = metricsManager.getContentDimensionsExact_(ws); - assertDimensionsMatch(zoomOut, 0, 0, 0, 0); + + suite('getAbsoluteMetrics', function() { + setup(function() { + this.ws = makeMockWs(1, 0, 0, 0, 0); + this.metricsManager = new Blockly.MetricsManager(this.ws); + this.toolboxMetricsStub = + sinon.stub(this.metricsManager, 'getToolboxMetrics'); + this.flyoutMetricsStub = + sinon.stub(this.metricsManager, 'getFlyoutMetrics'); + this.getToolboxStub = + sinon.stub(this.metricsManager.workspace_, 'getToolbox'); + this.getFlyoutStub = + sinon.stub(this.metricsManager.workspace_, 'getFlyout'); + }); + test('Toolbox at left', function() { + this.toolboxMetricsStub.returns({width: 107, height: 0, position: 2}); + this.flyoutMetricsStub.returns({}); + this.getToolboxStub.returns(true); + this.getFlyoutStub.returns(false); + + var absoluteMetrics = this.metricsManager.getAbsoluteMetrics(); + + assertDimensionsMatch(absoluteMetrics, 107, 0); + }); + test('Toolbox at top', function() { + this.toolboxMetricsStub.returns({width: 0, height: 107, position: 0}); + this.flyoutMetricsStub.returns({}); + this.getToolboxStub.returns(true); + this.getFlyoutStub.returns(false); + + var absoluteMetrics = this.metricsManager.getAbsoluteMetrics(); + + assertDimensionsMatch(absoluteMetrics, 0, 107); + }); + test('Flyout at left', function() { + this.toolboxMetricsStub.returns({}); + this.flyoutMetricsStub.returns({width: 107, height: 0, position: 2}); + this.getToolboxStub.returns(false); + this.getFlyoutStub.returns(true); + + var absoluteMetrics = this.metricsManager.getAbsoluteMetrics(); + + assertDimensionsMatch(absoluteMetrics, 107, 0); + }); + test('Flyout at top', function() { + this.toolboxMetricsStub.returns({}); + this.flyoutMetricsStub.returns({width: 0, height: 107, position: 0}); + this.getToolboxStub.returns(false); + this.getFlyoutStub.returns(true); + + var absoluteMetrics = this.metricsManager.getAbsoluteMetrics(); + + assertDimensionsMatch(absoluteMetrics, 0, 107); + }); }); - test('GetContentDimensionsExact - non empty at origin', function() { - var ws = makeMockWs(1, 0, 0, 100, 100); - var metricsManager = new Blockly.MetricsManager(ws); - var defaultZoom = metricsManager.getContentDimensionsExact_(ws); - // Pixel and ws units are the same at default zoom. - assertDimensionsMatch(defaultZoom, 0, 0, 100, 100); + + suite('getViewMetrics', function() { + setup(function() { + this.ws = makeMockWs(1, 0, 0, 0, 0); + this.metricsManager = new Blockly.MetricsManager(this.ws); + this.toolboxMetricsStub = + sinon.stub(this.metricsManager, 'getToolboxMetrics'); + this.flyoutMetricsStub = + sinon.stub(this.metricsManager, 'getFlyoutMetrics'); + this.getToolboxStub = + sinon.stub(this.metricsManager.workspace_, 'getToolbox'); + this.getFlyoutStub = + sinon.stub(this.metricsManager.workspace_, 'getFlyout'); + this.svgMetricsStub = sinon.stub(this.metricsManager, 'getSvgMetrics'); + }); + test('Toolbox at left', function() { + this.toolboxMetricsStub.returns({width: 107, height: 0, position: 2}); + this.flyoutMetricsStub.returns({}); + this.svgMetricsStub.returns({width: 500, height: 500}); + this.getToolboxStub.returns(true); + this.getFlyoutStub.returns(false); + + var viewMetrics = this.metricsManager.getViewMetrics(); + + assertDimensionsMatch(viewMetrics, -SCROLL_X, -SCROLL_Y, 393, 500); + }); + test('Toolbox at top', function() { + this.toolboxMetricsStub.returns({width: 0, height: 107, position: 0}); + this.flyoutMetricsStub.returns({}); + this.svgMetricsStub.returns({width: 500, height: 500}); + this.getToolboxStub.returns(true); + this.getFlyoutStub.returns(false); + + var viewMetrics = this.metricsManager.getViewMetrics(); + + assertDimensionsMatch(viewMetrics, -SCROLL_X, -SCROLL_Y, 500, 393); + }); + test('Flyout at left', function() { + this.toolboxMetricsStub.returns({}); + this.flyoutMetricsStub.returns({width: 107, height: 0, position: 2}); + this.svgMetricsStub.returns({width: 500, height: 500}); + this.getToolboxStub.returns(false); + this.getFlyoutStub.returns(true); + + var viewMetrics = this.metricsManager.getViewMetrics(); + + assertDimensionsMatch(viewMetrics, -SCROLL_X, -SCROLL_Y, 393, 500); + }); + test('Flyout at top', function() { + this.toolboxMetricsStub.returns({}); + this.flyoutMetricsStub.returns({width: 0, height: 107, position: 0}); + this.svgMetricsStub.returns({width: 500, height: 500}); + this.getToolboxStub.returns(false); + this.getFlyoutStub.returns(true); + + var viewMetrics = this.metricsManager.getViewMetrics(); + + assertDimensionsMatch(viewMetrics, -SCROLL_X, -SCROLL_Y, 500, 393); + }); + test('Get view metrics in workspace coordinates ', function() { + var scale = 2; + var getWorkspaceCoordinates = true; + + this.ws.scale = scale; + this.toolboxMetricsStub.returns({}); + this.flyoutMetricsStub.returns({width: 0, height: 107, position: 0}); + this.svgMetricsStub.returns({width: 500, height: 500}); + this.getToolboxStub.returns(false); + this.getFlyoutStub.returns(true); + + var viewMetrics = + this.metricsManager.getViewMetrics(getWorkspaceCoordinates); + + assertDimensionsMatch( + viewMetrics, -SCROLL_X / scale, -SCROLL_Y / scale, 500 / scale, + 393 / scale); + }); }); - test('GetContentDimensionsExact - non empty at origin zoom in', function() { - var ws = makeMockWs(2, 0, 0, 100, 100); - var metricsManager = new Blockly.MetricsManager(ws); - var zoomIn = metricsManager.getContentDimensionsExact_(ws); - // 1 ws unit = 2 pixels at this zoom level. - assertDimensionsMatch(zoomIn, 0, 0, 200, 200); - }); - test('GetContentDimensionsExact - non empty at origin zoom out', function() { - var ws = makeMockWs(.5, 0, 0, 100, 100); - var metricsManager = new Blockly.MetricsManager(ws); - var zoomOut = metricsManager.getContentDimensionsExact_(ws); - // 1 ws unit = 0.5 pixels at this zoom level. - assertDimensionsMatch(zoomOut, 0, 0, 50, 50); - }); - test('GetContentDimensionsExact - non empty positive origin', function() { - var ws = makeMockWs(1, 10, 10, 100, 100); - var metricsManager = new Blockly.MetricsManager(ws); - var defaultZoom = metricsManager.getContentDimensionsExact_(ws); - // Pixel and ws units are the same at default zoom. - assertDimensionsMatch(defaultZoom, 10, 10, 100, 100); - }); - test('GetContentDimensionsExact - non empty positive origin zoom in', function() { - var ws = makeMockWs(2, 10, 10, 100, 100); - var metricsManager = new Blockly.MetricsManager(ws); - var zoomIn = metricsManager.getContentDimensionsExact_(ws); - // 1 ws unit = 2 pixels at this zoom level. - assertDimensionsMatch(zoomIn, 20, 20, 200, 200); - }); - test('GetContentDimensionsExact - non empty positive origin zoom out', function() { - var ws = makeMockWs(.5, 10, 10, 100, 100); - var metricsManager = new Blockly.MetricsManager(ws); - var zoomOut = metricsManager.getContentDimensionsExact_(ws); - // 1 ws unit = 0.5 pixels at this zoom level. - assertDimensionsMatch(zoomOut, 5, 5, 50, 50); - }); - test('GetContentDimensionsExact - non empty negative origin', function() { - var ws = makeMockWs(1, -10, -10, 100, 100); - var metricsManager = new Blockly.MetricsManager(ws); - var defaultZoom = metricsManager.getContentDimensionsExact_(ws); - // Pixel and ws units are the same at default zoom. - assertDimensionsMatch(defaultZoom, -10, -10, 100, 100); - }); - test('GetContentDimensionsExact - non empty negative origin zoom in', function() { - var ws = makeMockWs(2, -10, -10, 100, 100); - var metricsManager = new Blockly.MetricsManager(ws); - var zoomIn = metricsManager.getContentDimensionsExact_(ws); - // 1 ws unit = 2 pixels at this zoom level. - assertDimensionsMatch(zoomIn, -20, -20, 200, 200); - }); - test('GetContentDimensionsExact - non empty negative origin zoom out', function() { - var ws = makeMockWs(.5, -10, -10, 100, 100); - var metricsManager = new Blockly.MetricsManager(ws); - var zoomOut = metricsManager.getContentDimensionsExact_(ws); - // 1 ws unit = 0.5 pixels at this zoom level. - assertDimensionsMatch(zoomOut, -5, -5, 50, 50); + + suite('getContentMetrics', function() { + setup(function() { + this.ws = makeMockWs(1, 0, 0, 0, 0); + this.metricsManager = new Blockly.MetricsManager(this.ws); + this.viewMetricsStub = sinon.stub(this.metricsManager, 'getViewMetrics'); + this.isContentBoundedStub = + sinon.stub(this.metricsManager.workspace_, 'isContentBounded'); + this.getBoundedMetricsStub = + sinon.stub(this.metricsManager, 'getContentDimensionsBounded_'); + this.getExactMetricsStub = + sinon.stub(this.metricsManager, 'getContentDimensionsExact_'); + }); + test('Content Dimensions in pixel coordinates bounded ws', function() { + this.isContentBoundedStub.returns(true); + this.getBoundedMetricsStub.returns( + {height: 100, width: 100, left: 100, top: 100}); + + var contentMetrics = this.metricsManager.getContentMetrics(false); + + // Should return what getContentDimensionsBounded_ returns. + assertDimensionsMatch(contentMetrics, 100, 100, 100, 100); + sinon.assert.calledOnce(this.getBoundedMetricsStub); + sinon.assert.calledOnce(this.viewMetricsStub); + }); + test('Content Dimensions in pixel coordinates exact ws', function() { + this.isContentBoundedStub.returns(false); + this.getExactMetricsStub.returns( + {height: 100, width: 100, left: 100, top: 100}); + + var contentMetrics = this.metricsManager.getContentMetrics(false); + + // Should return what getContentDimensionsExact_ returns. + assertDimensionsMatch(contentMetrics, 100, 100, 100, 100); + sinon.assert.calledOnce(this.getExactMetricsStub); + sinon.assert.notCalled(this.viewMetricsStub); + }); + test('Content Dimensions in ws coordinates bounded ws', function() { + var getWorkspaceCoordinates = true; + this.ws.scale = 2; + this.isContentBoundedStub.returns(true); + this.getBoundedMetricsStub.returns( + {height: 100, width: 100, left: 100, top: 100}); + + var contentMetrics = + this.metricsManager.getContentMetrics(getWorkspaceCoordinates); + + assertDimensionsMatch(contentMetrics, 50, 50, 50, 50); + sinon.assert.calledOnce(this.getBoundedMetricsStub); + sinon.assert.calledOnce(this.viewMetricsStub); + }); }); });