diff --git a/html/admin/js/graphViewer/graph/zoomManager.js b/html/admin/js/graphViewer/graph/zoomManager.js index bc2f42625d..690b37a4cd 100644 --- a/html/admin/js/graphViewer/graph/zoomManager.js +++ b/html/admin/js/graphViewer/graph/zoomManager.js @@ -29,7 +29,7 @@ //////////////////////////////////////////////////////////////////////////////// -function ZoomManager(width, height, config) { +function ZoomManager(width, height, g, nodeShaper, edgeShaper, config) { "use strict"; if (width === undefined || width < 0) { @@ -38,125 +38,134 @@ function ZoomManager(width, height, config) { if (height === undefined || height < 0) { throw("A height has to be given."); } + if (g === undefined || g.node === undefined || g.node().tagName !== "G") { + throw("A group has to be given."); + } + if (nodeShaper === undefined || nodeShaper.activate === undefined) { + throw("The Node shaper has to be given."); + } + if (edgeShaper === undefined || edgeShaper.activate === undefined) { + throw("The Edge shaper has to be given."); + } + var self = this, - fontMax, - fontMin, - rMax, - rMin, - rMid, - - radiusStep, - fontStep, - distortionStep, - + fontSize, + nodeRadius, + labelToggle, currentZoom, - currentFont, - currentRadius, currentLimit, currentDistortion, + currentDistortionRadius, size = width * height, + zoom, + calcNodeLimit = function () { - var div; - if (currentFont !== null) { - div = 60 * currentFont * currentFont; + var div, reqSize; + if (currentZoom >= labelToggle) { + reqSize = fontSize * currentZoom; + reqSize *= reqSize; + div = 60 * reqSize; } else { - div = 4 * currentRadius * currentRadius * Math.PI; + reqSize = nodeRadius * currentZoom; + reqSize *= reqSize; + div = 4 * Math.PI * reqSize; } return Math.floor(size / div); }, parseConfig = function (conf) { - fontMax = 16; - fontMin = 6; - rMax = 25; - rMin = 1; - rMid = (rMax - rMin) / 2 + rMin; - - fontStep = (fontMax - fontMin) / 100; - radiusStep = (rMax - rMin) / 200; - distortionStep = 0.001; // TODO! - - currentFont = fontMax; - currentRadius = rMax; - currentDistortion = 0; - currentLimit = calcNodeLimit(); - currentZoom = 0; - }, - adjustValues = function (out) { - if (out) { - currentZoom++; - if (currentZoom > 100) { - currentFont = null; - if (currentZoom === 200) { - currentRadius = rMin; - } else { - currentRadius -= radiusStep; - } - } else { - - if (currentZoom === 100) { - currentFont = fontMin; - currentRadius = rMid; - } else { - currentRadius -= radiusStep; - currentFont -= fontStep; - } - } - currentDistortion += distortionStep; - } else { - currentZoom--; - if (currentZoom < 100) { - if (currentZoom === 0) { - currentFont = fontMax; - currentRadius = rMax; - } else { - currentFont += fontStep; - currentRadius += radiusStep; - } - } else { - if (currentZoom === 100) { - currentFont = fontMin; - currentRadius = rMid; - } else { - currentRadius += radiusStep; - currentFont = null; - } - } - currentDistortion -= distortionStep; + if (conf === undefined) { + conf = {}; } + var + fontMax = conf.maxFont || 16, + fontMin = conf.minFont || 6, + rMax = conf.maxRadius || 25, + rMin = conf.minRadius || 1; + + fontSize = fontMax; + nodeRadius = rMax; + + labelToggle = 0; + currentDistortion = 0; + currentDistortionRadius = 100; currentLimit = calcNodeLimit(); + currentZoom = 1; + + zoom = d3.behavior.zoom() + .scaleExtent([rMin/rMax, 1]) + .on("zoom", function() { + // TODO: Still to be implemented + currentZoom = d3.event.scale; + currentLimit = calcNodeLimit(); + + //curTrans = $.extend({}, d3.event.translate); + /* + //curTrans[0] /= curZoom; + //curTrans[1] /= curZoom; + //console.log("here", d3.event.translate, d3.event.scale); + g.attr("transform", + "translate(" + d3.event.translate + ")" + + " scale(" + d3.event.scale + ")"); + if (d3.event.scale < stopLabel) { + test.remove(); + } + /* + fisheye + .distortion(1/d3.event.scale * fe_dist - 1); + */ + //.radius(1/d3.event.scale * fe_radius); + + }); + }; parseConfig(config); - self.getFontSize = function() { - return currentFont; + g.call(zoom); + + + self.translation = function() { + return null; }; - self.getRadius = function() { - return currentRadius; + self.scaleFactor = function() { + return currentZoom; }; + self.scaledMouse = function() { + return null; + }; + + self.mouseMoveHandle = function() { + // TODO + var focus = d3.mouse(this); + focus[0] += curTrans[0]; + focus[1] += curTrans[1]; + fisheye.focus(focus); + + node.each(function(d) { d.fisheye = fisheye(d); }) + .attr("cx", function(d) { return d.fisheye.x; }) + .attr("cy", function(d) { return d.fisheye.y; }) + .attr("r", function(d) { return d.fisheye.z * 25; }); + + link.attr("x1", function(d) { return d.source.fisheye.x; }) + .attr("y1", function(d) { return d.source.fisheye.y; }) + .attr("x2", function(d) { return d.target.fisheye.x; }) + .attr("y2", function(d) { return d.target.fisheye.y; }); + }; + self.getDistortion = function() { return currentDistortion; }; + self.getDistortionRadius = function() { + return currentDistortionRadius; + }; + self.getNodeLimit = function() { return currentLimit; }; - self.zoomIn = function() { - if (currentZoom === 0) { - return; - } - adjustValues(false); - }; - - self.zoomOut = function() { - if (currentZoom === 200) { - return; - } - adjustValues(true); - }; } \ No newline at end of file diff --git a/html/admin/js/graphViewer/jasmine_test/helper/eventHelper.js b/html/admin/js/graphViewer/jasmine_test/helper/eventHelper.js index e326e091a8..37efab6755 100644 --- a/html/admin/js/graphViewer/jasmine_test/helper/eventHelper.js +++ b/html/admin/js/graphViewer/jasmine_test/helper/eventHelper.js @@ -53,4 +53,20 @@ var helper = helper || {}; testee.dispatchEvent(evt); }; + helper.simulateScrollUpMouseEvent = function (objectId) { + var evt = document.createEvent("MouseEvents"), + testee = document.getElementById(objectId); + evt.initMouseEvent("DOMMouseScroll", true, true, window, + -10, 0, 0, 0, 0, false, false, false, false, 0, null); + testee.dispatchEvent(evt); + }; + + helper.simulateScrollDownMouseEvent = function (objectId) { + var evt = document.createEvent("MouseEvents"), + testee = document.getElementById(objectId); + evt.initMouseEvent("DOMMouseScroll", true, true, window, + 10, 0, 0, 0, 0, false, false, false, false, 0, null); + testee.dispatchEvent(evt); + }; + }()); \ No newline at end of file diff --git a/html/admin/js/graphViewer/jasmine_test/specZoomManager/zoomManagerSpec.js b/html/admin/js/graphViewer/jasmine_test/specZoomManager/zoomManagerSpec.js index ece1c0a4c0..3c8b05aa53 100644 --- a/html/admin/js/graphViewer/jasmine_test/specZoomManager/zoomManagerSpec.js +++ b/html/admin/js/graphViewer/jasmine_test/specZoomManager/zoomManagerSpec.js @@ -38,11 +38,32 @@ "use strict"; describe('Zoom Manager', function () { - var svg; + var svg, + g, + nodeShaperMock, + edgeShaperMock, + + simulateZoomOut = function () { + helper.simulateScrollUpMouseEvent("svg"); + }, + + simulateZoomIn = function () { + helper.simulateScrollDownMouseEvent("svg"); + }; beforeEach(function () { svg = document.createElement("svg"); document.body.appendChild(svg); + g = d3.select("svg").append("g"); + g.attr("id", "svg"); + nodeShaperMock = { + activateLabel: function() {} + }; + edgeShaperMock = { + activateLabel: function() {} + }; + spyOn(nodeShaperMock, "activateLabel"); + spyOn(edgeShaperMock, "activateLabel"); }); afterEach(function () { @@ -63,172 +84,149 @@ }).toThrow("A height has to be given."); }); - it('should not throw an error if mandatory information is given', function() { + it('should throw an error if the group is not given', function() { expect(function() { var s = new ZoomManager(10, 10); + }).toThrow("A group has to be given."); + }); + + it('should throw an error if the node shaper is not given', function() { + expect(function() { + var s = new ZoomManager(10, 10, g); + }).toThrow("The Node shaper has to be given."); + }); + + it('should throw an error if the edge shaper is not given', function() { + expect(function() { + var s = new ZoomManager(10, 10, g, nodeShaperMock); + }).toThrow("The Edge shaper has to be given."); + }); + + + it('should not throw an error if mandatory information is given', function() { + expect(function() { + var s = new ZoomManager(10, 10, g, nodeShaperMock, edgeShaperMock); }).not.toThrow(); }); }); - }); - describe('setup with default values', function() { + describe('setup with default values', function() { - var w, - h, - manager; + var w, + h, + manager; - beforeEach(function() { - w = 200; - h = 200; - manager = new ZoomManager(w, h); - }); - - describe('the interface', function() { - - it('should offer a function handle for zoom', function() { - expect(manager.zoomHandle).toBeDefined(); - expect(manager.zoomHandle).toEqual(jasmine.any(Function)); - }); - - it('should offer a function to get the current scale factor', function() { - expect(manager.scaleFactor).toBeDefined(); - expect(manager.scaleFactor).toEqual(jasmine.any(Function)); - }); - - it('should offer a function to get the current translation', function() { - expect(manager.translation).toBeDefined(); - expect(manager.translation).toEqual(jasmine.any(Function)); - }); - - it('should offer a function to get scaled mouse position', function() { - expect(manager.scaledMouse).toBeDefined(); - expect(manager.scaledMouse).toEqual(jasmine.any(Function)); - }); - - it('should offer a function to get the distortion', function() { - expect(manager.getDistortion).toBeDefined(); - expect(manager.getDistortion).toEqual(jasmine.any(Function)); - }); - - it('should offer a function to get the distortion radius', function() { - expect(manager.getDistortionRadius).toBeDefined(); - expect(manager.getDistortionRadius).toEqual(jasmine.any(Function)); - }); - - it('should offer a function to get the node limit', function() { - expect(manager.getNodeLimit).toBeDefined(); - expect(manager.getNodeLimit).toEqual(jasmine.any(Function)); - }); - - // Old interface might be unused! - - it('should offer a function to get the current font-size', function() { - expect(manager.getFontSize).toBeDefined(); - expect(manager.getFontSize).toEqual(jasmine.any(Function)); - }); - - it('should offer a function to get the current node-radius', function() { - expect(manager.getRadius).toBeDefined(); - expect(manager.getRadius).toEqual(jasmine.any(Function)); - }); - - it('should offer a function for zoom-in', function() { - expect(manager.zoomIn).toBeDefined(); - expect(manager.zoomIn).toEqual(jasmine.any(Function)); - }); - - it('should offer a function for zoom-out', function() { - expect(manager.zoomOut).toBeDefined(); - expect(manager.zoomOut).toEqual(jasmine.any(Function)); - }); - }); - - describe('default values', function() { - - var fontMax, - fontMin, - radMax, - radMin, - nodeMax, - nodeMaxNoLabel, - nodeMinLabel, - nodeMin; - - beforeEach(function() { - var labelSize = function (font) { - return 60 * font * font; - }, - circleSize = function (radius) { - return 4 * radius * radius * Math.PI; - }; - fontMax = 16; - fontMin = 6; - radMax = 25; - radMin = 1; - nodeMax = Math.floor(w * h / labelSize(fontMax)); - nodeMinLabel = Math.floor(w * h / labelSize(fontMin)); - nodeMaxNoLabel = Math.floor(w * h / circleSize((radMax - radMin) / 2 + radMin)); - nodeMin = Math.floor(w * h / circleSize(radMin)); + w = 200; + h = 200; + manager = new ZoomManager(w, h, g, nodeShaperMock, edgeShaperMock); }); + + describe('the interface', function() { + + it('should offer a function handle for the mouse movement', function() { + expect(manager.mouseMoveHandle).toBeDefined(); + expect(manager.mouseMoveHandle).toEqual(jasmine.any(Function)); + }); + + it('should offer a function to get the current scale factor', function() { + expect(manager.scaleFactor).toBeDefined(); + expect(manager.scaleFactor).toEqual(jasmine.any(Function)); + }); + + it('should offer a function to get the current translation', function() { + expect(manager.translation).toBeDefined(); + expect(manager.translation).toEqual(jasmine.any(Function)); + }); + + it('should offer a function to get scaled mouse position', function() { + expect(manager.scaledMouse).toBeDefined(); + expect(manager.scaledMouse).toEqual(jasmine.any(Function)); + }); + + it('should offer a function to get the distortion', function() { + expect(manager.getDistortion).toBeDefined(); + expect(manager.getDistortion).toEqual(jasmine.any(Function)); + }); + + it('should offer a function to get the distortion radius', function() { + expect(manager.getDistortionRadius).toBeDefined(); + expect(manager.getDistortionRadius).toEqual(jasmine.any(Function)); + }); + + it('should offer a function to get the node limit', function() { + expect(manager.getNodeLimit).toBeDefined(); + expect(manager.getNodeLimit).toEqual(jasmine.any(Function)); + }); - it('should offer maximized values if no zoom happens', function() { - expect(manager.getFontSize()).toEqual(fontMax); - expect(manager.getRadius()).toEqual(radMax); - expect(manager.getNodeLimit()).toEqual(nodeMax); - expect(manager.getDistortion()).toBeCloseTo(0, 6); }); + + describe('default values', function() { + + var fontMax, + fontMin, + radMax, + radMin, + nodeMax, + nodeMaxNoLabel, + nodeMinLabel, + nodeMin, + distRBase; - it('should not be possible to zoom in if max-zoom is reached', function() { - var oldFS = manager.getFontSize(), - oldR = manager.getRadius(), - oldNL = manager.getNodeLimit(), - oldD = manager.getDistortion(); - manager.zoomIn(); - expect(manager.getFontSize()).toEqual(oldFS); - expect(manager.getRadius()).toEqual(oldR); - expect(manager.getNodeLimit()).toEqual(oldNL); - expect(manager.getDistortion()).toEqual(oldD); - }); - it('should be possible to zoom-out until minimal font-size is reached', function() { - var oldFS, - oldR, - oldNL, - oldD, - loopCounter = 0; - while (manager.getFontSize() > fontMin && manager.getFontSize() !== null) { - oldFS = manager.getFontSize(); - oldR = manager.getRadius(); - oldNL = manager.getNodeLimit(); - oldD = manager.getDistortion(); - manager.zoomOut(); - expect(manager.getFontSize()).toBeLessThan(oldFS); - expect(manager.getRadius()).toBeLessThan(oldR); - expect(manager.getNodeLimit()).not.toBeLessThan(oldNL); - expect(manager.getDistortion()).toBeGreaterThan(oldD); - loopCounter++; - if (loopCounter === 1000) { - this.fail(new Error('The minimal font-size should have been reached')); - break; - } - } - if (manager.getFontSize() === null) { - manager.zoomIn(); - } - expect(manager.getFontSize()).toBeCloseTo(fontMin, 6); - expect(manager.getRadius()).toBeCloseTo((radMax-radMin) / 2 + radMin, 6); - expect(manager.getNodeLimit()).toBeCloseTo(nodeMinLabel, 6); - //expect(manager.getDistortion()).toBeCloseTo(0, 6); - }); - - describe('with zoomlevel adjusted to minimal font-size', function() { - beforeEach(function() { - var loopCounter = 0; + var labelSize = function (font) { + return 60 * font * font; + }, + circleSize = function (radius) { + return 4 * radius * radius * Math.PI; + }; + fontMax = 16; + fontMin = 6; + radMax = 25; + radMin = 1; + distRBase = 100; + nodeMax = Math.floor(w * h / labelSize(fontMax)); + nodeMinLabel = Math.floor(w * h / labelSize(fontMin)); + nodeMaxNoLabel = Math.floor(w * h / circleSize((radMax - radMin) / 2 + radMin)); + nodeMin = Math.floor(w * h / circleSize(radMin)); + }); + + it('should offer maximized values if no zoom happens', function() { + expect(manager.getNodeLimit()).toEqual(nodeMax); + expect(manager.getDistortion()).toBeCloseTo(0, 6); + expect(manager.getDistortionRadius()).toEqual(distRBase); + }); + + it('should not be possible to zoom in if max-zoom is reached', function() { + var oldNL = manager.getNodeLimit(), + oldD = manager.getDistortion(), + oldDR = manager.getDistortionRadius(), + oldSF = manager.scaleFactor(); + simulateZoomIn(); + expect(manager.getNodeLimit()).toEqual(oldNL); + expect(manager.getDistortion()).toEqual(oldD); + expect(manager.getDistortionRadius()).toEqual(oldDR); + expect(manager.scaleFactor()).not.toBeLessThan(oldSF); + }); + + it('should be possible to zoom-out until labels are removed', function() { + var oldNL, + oldSF, + oldD, + oldDR, + loopCounter = 0; while (manager.getFontSize() > fontMin && manager.getFontSize() !== null) { - manager.zoomOut(); + oldNL = manager.getNodeLimit(); + oldD = manager.getDistortion(); + oldDR = manager.getDistortionRadius(); + oldSF = manager.scaleFactor(); + simulateZoomOut(); + expect(manager.getNodeLimit()).not.toBeLessThan(oldNL); + expect(manager.getDistortion()).toBeGreaterThan(oldD); + expect(manager.getDistortionRadius()).toBeGreaterThan(oldDR); + expect(manager.scaleFactor()).not.toBeLessThan(oldSF); loopCounter++; if (loopCounter === 1000) { this.fail(new Error('The minimal font-size should have been reached')); @@ -236,130 +234,155 @@ } } if (manager.getFontSize() === null) { - manager.zoomIn(); - } - }); - - it('should be able to zoom-in again', function() { - var oldFS, - oldR, - oldNL, - oldD, - loopCounter = 0; - while (manager.getFontSize() < fontMax) { - oldFS = manager.getFontSize(); - oldR = manager.getRadius(); - oldNL = manager.getNodeLimit(); - oldD = manager.getDistortion(); - manager.zoomIn(); - expect(manager.getFontSize()).toBeGreaterThan(oldFS); - expect(manager.getRadius()).toBeGreaterThan(oldR); - expect(manager.getNodeLimit()).not.toBeGreaterThan(oldNL); - expect(manager.getDistortion()).toBeLessThan(oldD); - loopCounter++; - if (loopCounter === 1000) { - this.fail(new Error('The maximal font-size should have been reached')); - break; - } - } - expect(manager.getFontSize()).toEqual(fontMax); - expect(manager.getRadius()).toEqual(radMax); - expect(manager.getNodeLimit()).toEqual(nodeMax); - expect(manager.getDistortion()).toBeCloseTo(0, 6); - }); - - it('should return null for font-size if further zoomed out', function() { - manager.zoomOut(); - expect(manager.getFontSize()).toEqual(null); - }); - - it('should significantly increase the node limit if further zoomed out', function() { - manager.zoomOut(); - expect(manager.getNodeLimit()).toBeGreaterThan(nodeMaxNoLabel); - }); - - it('should be able to zoom-out until minimal node radius is reached', function() { - var oldR, - oldNL, - oldD, - loopCounter = 0; - while (manager.getRadius() > radMin) { - oldR = manager.getRadius(); - oldNL = manager.getNodeLimit(); - oldD = manager.getDistortion(); - manager.zoomOut(); - expect(manager.getFontSize()).toEqual(null); - expect(manager.getRadius()).toBeLessThan(oldR); - expect(manager.getNodeLimit()).not.toBeLessThan(oldNL); - expect(manager.getDistortion()).toBeGreaterThan(oldD); - loopCounter++; - if (loopCounter === 1000) { - this.fail(new Error('The minimal font-size should have been reached')); - break; - } - } - expect(manager.getRadius()).toEqual(radMin); - expect(manager.getNodeLimit()).toEqual(nodeMin); - //expect(manager.getDistortion()).toBeCloseTo(0, 6); - }); - - }); - - describe('with zoomlevel adjusted to maximal zoom out', function() { - - beforeEach(function() { - var loopCounter = 0; - while (manager.getRadius() > radMin) { - manager.zoomOut(); - loopCounter++; - if (loopCounter === 2000) { - this.fail(new Error('The minimal zoom level should have been reached')); - break; - } - } - }); - - it('should not be able to further zoom out', function() { - var oldR = manager.getRadius(), - oldNL = manager.getNodeLimit(), - oldD = manager.getDistortion(); - manager.zoomOut(); - expect(manager.getRadius()).toEqual(oldR); - expect(manager.getNodeLimit()).toEqual(oldNL); - expect(manager.getDistortion()).toEqual(oldD); - }); - - it('should be able to zoom-in again', function() { - var oldR, - oldNL, - oldD, - loopCounter = 0; - while (manager.getFontSize() === null) { - oldR = manager.getRadius(); - oldNL = manager.getNodeLimit(); - oldD = manager.getDistortion(); - manager.zoomIn(); - expect(manager.getRadius()).toBeGreaterThan(oldR); - expect(manager.getNodeLimit()).not.toBeGreaterThan(oldNL); - expect(manager.getDistortion()).toBeLessThan(oldD); - loopCounter++; - if (loopCounter === 1000) { - this.fail(new Error('The minimal font-size should have been reached')); - break; - } + simulateZoomIn(); } expect(manager.getFontSize()).toBeCloseTo(fontMin, 6); expect(manager.getRadius()).toBeCloseTo((radMax-radMin) / 2 + radMin, 6); expect(manager.getNodeLimit()).toBeCloseTo(nodeMinLabel, 6); //expect(manager.getDistortion()).toBeCloseTo(0, 6); }); + + describe('with zoomlevel adjusted to minimal font-size', function() { + beforeEach(function() { + var loopCounter = 0; + while (manager.getFontSize() > fontMin && manager.getFontSize() !== null) { + simulateZoomOut(); + loopCounter++; + if (loopCounter === 1000) { + this.fail(new Error('The minimal font-size should have been reached')); + break; + } + } + if (manager.getFontSize() === null) { + simulateZoomIn(); + } + }); + + it('should be able to zoom-in again', function() { + var oldFS, + oldR, + oldNL, + oldD, + loopCounter = 0; + while (manager.getFontSize() < fontMax) { + oldFS = manager.getFontSize(); + oldR = manager.getRadius(); + oldNL = manager.getNodeLimit(); + oldD = manager.getDistortion(); + simulateZoomIn(); + expect(manager.getFontSize()).toBeGreaterThan(oldFS); + expect(manager.getRadius()).toBeGreaterThan(oldR); + expect(manager.getNodeLimit()).not.toBeGreaterThan(oldNL); + expect(manager.getDistortion()).toBeLessThan(oldD); + loopCounter++; + if (loopCounter === 1000) { + this.fail(new Error('The maximal font-size should have been reached')); + break; + } + } + expect(manager.getFontSize()).toEqual(fontMax); + expect(manager.getRadius()).toEqual(radMax); + expect(manager.getNodeLimit()).toEqual(nodeMax); + expect(manager.getDistortion()).toBeCloseTo(0, 6); + }); + + it('should return null for font-size if further zoomed out', function() { + simulateZoomOut(); + expect(manager.getFontSize()).toEqual(null); + }); + + it('should significantly increase the node limit if further zoomed out', function() { + simulateZoomOut(); + expect(manager.getNodeLimit()).toBeGreaterThan(nodeMaxNoLabel); + }); + + it('should be able to zoom-out until minimal node radius is reached', function() { + var oldR, + oldNL, + oldD, + loopCounter = 0; + while (manager.getRadius() > radMin) { + oldR = manager.getRadius(); + oldNL = manager.getNodeLimit(); + oldD = manager.getDistortion(); + simulateZoomOut(); + expect(manager.getFontSize()).toEqual(null); + expect(manager.getRadius()).toBeLessThan(oldR); + expect(manager.getNodeLimit()).not.toBeLessThan(oldNL); + expect(manager.getDistortion()).toBeGreaterThan(oldD); + loopCounter++; + if (loopCounter === 1000) { + this.fail(new Error('The minimal font-size should have been reached')); + break; + } + } + expect(manager.getRadius()).toEqual(radMin); + expect(manager.getNodeLimit()).toEqual(nodeMin); + //expect(manager.getDistortion()).toBeCloseTo(0, 6); + }); + + }); + + describe('with zoomlevel adjusted to maximal zoom out', function() { + + beforeEach(function() { + var loopCounter = 0; + while (manager.getRadius() > radMin) { + simulateZoomOut(); + loopCounter++; + if (loopCounter === 2000) { + this.fail(new Error('The minimal zoom level should have been reached')); + break; + } + } + }); + + it('should not be able to further zoom out', function() { + var oldR = manager.getRadius(), + oldNL = manager.getNodeLimit(), + oldD = manager.getDistortion(); + simulateZoomOut(); + expect(manager.getRadius()).toEqual(oldR); + expect(manager.getNodeLimit()).toEqual(oldNL); + expect(manager.getDistortion()).toEqual(oldD); + }); + + it('should be able to zoom-in again', function() { + var oldR, + oldNL, + oldD, + loopCounter = 0; + while (manager.getFontSize() === null) { + oldR = manager.getRadius(); + oldNL = manager.getNodeLimit(); + oldD = manager.getDistortion(); + simulateZoomIn(); + expect(manager.getRadius()).toBeGreaterThan(oldR); + expect(manager.getNodeLimit()).not.toBeGreaterThan(oldNL); + expect(manager.getDistortion()).toBeLessThan(oldD); + loopCounter++; + if (loopCounter === 1000) { + this.fail(new Error('The minimal font-size should have been reached')); + break; + } + } + expect(manager.getFontSize()).toBeCloseTo(fontMin, 6); + expect(manager.getRadius()).toBeCloseTo((radMax-radMin) / 2 + radMin, 6); + expect(manager.getNodeLimit()).toBeCloseTo(nodeMinLabel, 6); + //expect(manager.getDistortion()).toBeCloseTo(0, 6); + }); + + }); }); }); + + describe('testing user-defined values', function() { + + }); + }); - describe('testing user-defined values', function() { - - }); + }()); \ No newline at end of file