UNPKG

dcos-dygraphs

Version:

dygraphs is a fast, flexible open source JavaScript charting library.

506 lines (408 loc) 13.7 kB
/** * @fileoverview Test cases for the interaction model. * * @author konigsberg@google.com (Robert Konigsbrg) */ import Dygraph from '../../src/dygraph'; import DygraphInteraction from '../../src/dygraph-interaction-model'; import DygraphOps from './DygraphOps'; describe("interaction-model", function() { cleanupAfterEach(); var data1 = "X,Y\n" + "20,-1\n" + "21,0\n" + "22,1\n" + "23,0\n"; var data2 = "X,Y\n" + "1,10\n" + "2,20\n" + "3,30\n" + "4,40\n" + "5,120\n" + "6,50\n" + "7,70\n" + "8,90\n" + "9,50\n"; function getXLabels() { var x_labels = document.getElementsByClassName("dygraph-axis-label-x"); var ary = []; for (var i = 0; i < x_labels.length; i++) { ary.push(x_labels[i].innerHTML); } return ary; } /* it('testPan', function() { var originalXRange = g.xAxisRange(); var originalYRange = g.yAxisRange(0); DygraphOps.dispatchMouseDown(g, xRange[0], yRange[0]); DygraphOps.dispatchMouseMove(g, xRange[1], yRange[0]); // this is really necessary. DygraphOps.dispatchMouseUp(g, xRange[1], yRange[0]); assert.closeTo(xRange, g.xAxisRange(), 0.2); // assert.closeTo(originalYRange, g.yAxisRange(0), 0.2); // Not true, it's something in the middle. var midX = (xRange[1] - xRange[0]) / 2; DygraphOps.dispatchMouseDown(g, midX, yRange[0]); DygraphOps.dispatchMouseMove(g, midX, yRange[1]); // this is really necessary. DygraphOps.dispatchMouseUp(g, midX, yRange[1]); assert.closeTo(xRange, g.xAxisRange(), 0.2); assert.closeTo(yRange, g.yAxisRange(0), 0.2); }); */ /** * This tests that when changing the interaction model so pan is used instead * of zoom as the default behavior, a standard click method is still called. */ it('testClickCallbackIsCalled', function() { var clicked; var clickCallback = function(event, x) { clicked = x; }; var graph = document.getElementById("graph"); var g = new Dygraph(graph, data1, { width: 100, height : 100, clickCallback : clickCallback }); DygraphOps.dispatchMouseDown_Point(g, 10, 10); DygraphOps.dispatchMouseMove_Point(g, 10, 10); DygraphOps.dispatchMouseUp_Point(g, 10, 10); assert.equal(20, clicked); }); /** * This tests that when changing the interaction model so pan is used instead * of zoom as the default behavior, a standard click method is still called. */ it('testClickCallbackIsCalledOnCustomPan', function() { var clicked; var clickCallback = function(event, x) { clicked = x; }; function customDown(event, g, context) { context.initializeMouseDown(event, g, context); DygraphInteraction.startPan(event, g, context); } function customMove(event, g, context) { DygraphInteraction.movePan(event, g, context); } function customUp(event, g, context) { DygraphInteraction.endPan(event, g, context); } var opts = { width: 100, height : 100, clickCallback : clickCallback, interactionModel : { 'mousedown' : customDown, 'mousemove' : customMove, 'mouseup' : customUp, } }; var graph = document.getElementById("graph"); var g = new Dygraph(graph, data1, opts); DygraphOps.dispatchMouseDown_Point(g, 10, 10); DygraphOps.dispatchMouseMove_Point(g, 10, 10); DygraphOps.dispatchMouseUp_Point(g, 10, 10); assert.equal(20, clicked); }); var clickAt = function(g, x, y) { DygraphOps.dispatchMouseDown(g, x, y); DygraphOps.dispatchMouseMove(g, x, y); DygraphOps.dispatchMouseUp(g, x, y); }; /** * This tests that clickCallback is still called with the nonInteractiveModel. */ it('testClickCallbackIsCalledWithNonInteractiveModel', function() { var clicked; // TODO(danvk): also test pointClickCallback here. var clickCallback = function(event, x) { clicked = x; }; var opts = { width: 100, height : 100, clickCallback : clickCallback, interactionModel : DygraphInteraction.nonInteractiveModel_ }; var graph = document.getElementById("graph"); var g = new Dygraph(graph, data1, opts); DygraphOps.dispatchMouseDown_Point(g, 10, 10); DygraphOps.dispatchMouseMove_Point(g, 10, 10); DygraphOps.dispatchMouseUp_Point(g, 10, 10); assert.equal(20, clicked); }); /** * A sanity test to ensure pointClickCallback is called. */ it('testPointClickCallback', function() { var clicked = null; var g = new Dygraph('graph', data2, { pointClickCallback: function(event, point) { clicked = point; } }); clickAt(g, 4, 40); assert.isNotNull(clicked); assert.equal(4, clicked.xval); assert.equal(40, clicked.yval); }); /** * A sanity test to ensure pointClickCallback is not called when out of range. */ it('testNoPointClickCallbackWhenOffPoint', function() { var clicked; var g = new Dygraph(document.getElementById("graph"), data2, { pointClickCallback : function(event, point) { clicked = point; } }); clickAt(g, 5, 40); assert.isUndefined(clicked); }); /** * Ensures pointClickCallback circle size is taken into account. */ it('testPointClickCallback_circleSize', function() { // TODO(konigsberg): Implement. }); /** * Ensures that pointClickCallback is called prior to clickCallback */ it('testPointClickCallbackCalledPriorToClickCallback', function() { var counter = 0; var pointClicked; var clicked; var g = new Dygraph(document.getElementById("graph"), data2, { pointClickCallback : function(event, point) { counter++; pointClicked = counter; }, clickCallback : function(event, point) { counter++; clicked = counter; } }); clickAt(g, 4, 40); assert.equal(1, pointClicked); assert.equal(2, clicked); }); /** * Ensures that when there's no pointClickCallback, clicking on a point still calls * clickCallback */ it('testClickCallback_clickOnPoint', function() { var clicked; var g = new Dygraph(document.getElementById("graph"), data2, { clickCallback : function(event, point) { clicked = 1; } }); clickAt(g, 4, 40); assert.equal(1, clicked); }); it('testIsZoomed_none', function() { var g = new Dygraph(document.getElementById("graph"), data2, {}); assert.isFalse(g.isZoomed()); assert.isFalse(g.isZoomed("x")); assert.isFalse(g.isZoomed("y")); }); it('testIsZoomed_x', function() { var g = new Dygraph(document.getElementById("graph"), data2, {}); DygraphOps.dispatchMouseDown_Point(g, 100, 100); DygraphOps.dispatchMouseMove_Point(g, 130, 100); DygraphOps.dispatchMouseUp_Point(g, 130, 100); assert.isTrue(g.isZoomed()); assert.isTrue(g.isZoomed("x")); assert.isFalse(g.isZoomed("y")); }); it('testIsZoomed_y', function() { var g = new Dygraph(document.getElementById("graph"), data2, {}); DygraphOps.dispatchMouseDown_Point(g, 10, 10); DygraphOps.dispatchMouseMove_Point(g, 10, 30); DygraphOps.dispatchMouseUp_Point(g, 10, 30); assert.isTrue(g.isZoomed()); assert.isFalse(g.isZoomed("x")); assert.isTrue(g.isZoomed("y")); }); it('testIsZoomed_both', function() { var g = new Dygraph(document.getElementById("graph"), data2, {}); // Zoom x axis DygraphOps.dispatchMouseDown_Point(g, 100, 100); DygraphOps.dispatchMouseMove_Point(g, 130, 100); DygraphOps.dispatchMouseUp_Point(g, 130, 100); // Now zoom y axis DygraphOps.dispatchMouseDown_Point(g, 100, 100); DygraphOps.dispatchMouseMove_Point(g, 100, 130); DygraphOps.dispatchMouseUp_Point(g, 100, 130); assert.isTrue(g.isZoomed()); assert.isTrue(g.isZoomed("x")); assert.isTrue(g.isZoomed("y")); }); it('testIsZoomed_updateOptions_none', function() { var g = new Dygraph(document.getElementById("graph"), data2, {}); g.updateOptions({}); assert.isFalse(g.isZoomed()); assert.isFalse(g.isZoomed("x")); assert.isFalse(g.isZoomed("y")); }); it('testIsZoomed_updateOptions_x', function() { var g = new Dygraph(document.getElementById("graph"), data2, {}); g.updateOptions({dateWindow: [-.5, .3]}); assert.isTrue(g.isZoomed()); assert.isTrue(g.isZoomed("x")); assert.isFalse(g.isZoomed("y")); }); it('testIsZoomed_updateOptions_y', function() { var g = new Dygraph(document.getElementById("graph"), data2, {}); g.updateOptions({valueRange: [1, 10]}); assert.isTrue(g.isZoomed()); assert.isFalse(g.isZoomed("x")); assert.isTrue(g.isZoomed("y")); }); it('testIsZoomed_updateOptions_both', function() { var g = new Dygraph(document.getElementById("graph"), data2, {}); g.updateOptions({dateWindow: [-1, 1], valueRange: [1, 10]}); assert.isTrue(g.isZoomed()); assert.isTrue(g.isZoomed("x")); assert.isTrue(g.isZoomed("y")); }); it('testCorrectAxisValueRangeAfterUnzoom', function() { var g = new Dygraph(document.getElementById("graph"), data2, { valueRange: [1, 50], dateWindow: [1, 9], animatedZooms:false }); // Zoom x axis DygraphOps.dispatchMouseDown_Point(g, 100, 100); DygraphOps.dispatchMouseMove_Point(g, 130, 100); DygraphOps.dispatchMouseUp_Point(g, 130, 100); // Zoom y axis DygraphOps.dispatchMouseDown_Point(g, 100, 100); DygraphOps.dispatchMouseMove_Point(g, 100, 130); DygraphOps.dispatchMouseUp_Point(g, 100, 130); var currentYAxisRange = g.yAxisRange(); var currentXAxisRange = g.xAxisRange(); //check that the range for the axis has changed assert.notEqual(1, currentXAxisRange[0]); assert.notEqual(10, currentXAxisRange[1]); assert.notEqual(1, currentYAxisRange[0]); assert.notEqual(50, currentYAxisRange[1]); // unzoom by doubleclick. This is really the order in which a browser // generates events, and we depend on it. DygraphOps.dispatchMouseDown_Point(g, 10, 10); DygraphOps.dispatchMouseUp_Point(g, 10, 10); DygraphOps.dispatchMouseDown_Point(g, 10, 10); DygraphOps.dispatchMouseUp_Point(g, 10, 10); DygraphOps.dispatchDoubleClick(g, null); // check if range for y-axis was reset to original value // TODO check if range for x-axis is correct. // Currently not possible because dateRange is set to null and extremes are returned var newYAxisRange = g.yAxisRange(); assert.equal(1, newYAxisRange[0]); assert.equal(50, newYAxisRange[1]); }); /** * Ensures pointClickCallback is called when some points along the y-axis don't * exist. */ it('testPointClickCallback_missingData', function() { // There's a B-value at 2, but no A-value. var data = "X,A,B\n" + "1,,100\n"+ "2,,110\n"+ "3,140,120\n"+ "4,130,110\n"+ ""; var clicked; var g = new Dygraph(document.getElementById("graph"), data, { pointClickCallback : function(event, point) { clicked = point; } }); clickAt(g, 2, 110); assert.equal(2, clicked.xval); assert.equal(110, clicked.yval); }); describe('animated zooms', function() { var oldDuration; before(function() { oldDuration = Dygraph.ANIMATION_DURATION; Dygraph.ANIMATION_DURATION = 100; // speed up the animation for testing }); after(function() { Dygraph.ANIMATION_DURATION = oldDuration; }); it('should support animated zooms', function(done) { var data = "X,A,B\n" + "1,120,100\n"+ "2,110,110\n"+ "3,140,120\n"+ "4,130,110\n"; var ranges = []; var g = new Dygraph('graph', data, { animatedZooms: true, }); // updating the dateWindow does not result in an animation. assert.deepEqual([1, 4], g.xAxisRange()); g.updateOptions({dateWindow: [2, 4]}); assert.deepEqual([2, 4], g.xAxisRange()); g.updateOptions({ // zoomCallback is called once when the animation is complete. zoomCallback: function(xMin, xMax) { assert.equal(1, xMin); assert.equal(4, xMax); assert.deepEqual([1, 4], g.xAxisRange()); done(); } }, false); // Zoom out -- resetZoom() _does_ produce an animation. g.resetZoom(); assert.notDeepEqual([2, 4], g.xAxisRange()); // first frame is synchronous assert.notDeepEqual([1, 4], g.xAxisRange()); // at this point control flow goes up to zoomCallback }); }); //bulk copied from "testCorrectAxisValueRangeAfterUnzoom" //tests if the xRangePad is taken into account after unzoom. it('testCorrectAxisPaddingAfterUnzoom', function() { var g = new Dygraph(document.getElementById("graph"), data2, { valueRange: [1, 50], dateWindow: [1, 9], xRangePad: 10, animatedZooms:false }); var extremes = g.xAxisExtremes(); // Zoom x axis DygraphOps.dispatchMouseDown_Point(g, 100, 100); DygraphOps.dispatchMouseMove_Point(g, 130, 100); DygraphOps.dispatchMouseUp_Point(g, 130, 100); // Zoom y axis DygraphOps.dispatchMouseDown_Point(g, 100, 100); DygraphOps.dispatchMouseMove_Point(g, 100, 130); DygraphOps.dispatchMouseUp_Point(g, 100, 130); var currentYAxisRange = g.yAxisRange(); var currentXAxisRange = g.xAxisRange(); //check that the range for the axis has changed assert.notEqual(1, currentXAxisRange[0]); assert.notEqual(10, currentXAxisRange[1]); assert.notEqual(1, currentYAxisRange[0]); assert.notEqual(50, currentYAxisRange[1]); // unzoom by doubleclick. This is really the order in which a browser // generates events, and we depend on it. DygraphOps.dispatchMouseDown_Point(g, 10, 10); DygraphOps.dispatchMouseUp_Point(g, 10, 10); DygraphOps.dispatchMouseDown_Point(g, 10, 10); DygraphOps.dispatchMouseUp_Point(g, 10, 10); DygraphOps.dispatchDoubleClick(g, null); // check if range for x-axis was reset to original value var newXAxisRange = g.xAxisRange(); assert.equal(extremes[0], newXAxisRange[0]); assert.equal(extremes[1], newXAxisRange[1]); }); });