dcos-dygraphs
Version:
dygraphs is a fast, flexible open source JavaScript charting library.
384 lines (325 loc) • 10.4 kB
JavaScript
// Copyright (c) 2011 Google, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
/**
* @fileoverview Test valueRange and dateWindow changes.
*
* @author konigsberg@google.com (Robert Konigsberg)
*/
import Dygraph from '../../src/dygraph';
import DygraphOps from './DygraphOps';
import {assertDeepCloseTo} from './custom_asserts';
var ZERO_TO_FIFTY = [[ 10, 0 ] , [ 20, 50 ]];
var ZERO_TO_FIFTY_STEPS = (function() {
var a = [];
var x = 10;
var y = 0;
var step = 0;
for (step = 0; step <= 50; step++) {
a.push([x + (step * .2), y + step]);
}
return a;
}());
var FIVE_TO_ONE_THOUSAND = [
[ 1, 10 ], [ 2, 20 ], [ 3, 30 ], [ 4, 40 ] , [ 5, 50 ],
[ 6, 60 ], [ 7, 70 ], [ 8, 80 ], [ 9, 90 ] , [ 10, 1000 ]];
describe("range-tests", function() {
cleanupAfterEach();
var createGraph = function(opts, data, expectRangeX, expectRangeY) {
if (data === undefined) data = ZERO_TO_FIFTY_STEPS;
if (expectRangeX === undefined) expectRangeX = [10, 20];
if (expectRangeY === undefined) expectRangeY = [0, 55];
if (!opts) opts = {};
opts['labels'] = ['X', 'Y'];
var g = new Dygraph('graph', data, opts);
assertDeepCloseTo(expectRangeX, g.xAxisRange(), 0.01);
assertDeepCloseTo(expectRangeY, g.yAxisRange(0), 0.01);
return g;
};
/**
* Test that changes to valueRange and dateWindow are reflected
* appropriately.
*/
it('testRangeSetOperations', function() {
var g = createGraph({valueRange : [ 0, 55 ]});
g.updateOptions({ dateWindow : [ 12, 18 ] });
assert.deepEqual([12, 18], g.xAxisRange());
assert.deepEqual([0, 55], g.yAxisRange(0));
g.updateOptions({ valueRange : [ 10, 40 ] });
assert.deepEqual([12, 18], g.xAxisRange());
assert.deepEqual([10, 40], g.yAxisRange(0));
g.updateOptions({ valueRange: [10, NaN] });
assert.deepEqual([12, 18], g.xAxisRange());
assert.deepEqual([10, 44.2], g.yAxisRange(0));
g.updateOptions({ valueRange: [10, 40] });
assert.deepEqual([12, 18], g.xAxisRange());
assert.deepEqual([10, 40], g.yAxisRange(0));
g.updateOptions({ valueRange: [10, null] });
assert.deepEqual([12, 18], g.xAxisRange());
assert.deepEqual([10, 44.2], g.yAxisRange(0));
g.updateOptions({ valueRange: [10, 40] });
assert.deepEqual([12, 18], g.xAxisRange());
assert.deepEqual([10, 40], g.yAxisRange(0));
g.updateOptions({ valueRange: [10, undefined] });
assert.deepEqual([12, 18], g.xAxisRange());
assert.deepEqual([10, 44.2], g.yAxisRange(0));
g.updateOptions({ valueRange: [10, 40] });
assert.deepEqual([12, 18], g.xAxisRange());
assert.deepEqual([10, 40], g.yAxisRange(0));
g.updateOptions({ });
assert.deepEqual([12, 18], g.xAxisRange());
assert.deepEqual([10, 40], g.yAxisRange(0));
g.updateOptions({valueRange : null, axes: {y:{valueRange : [15, 20]}}});
assert.deepEqual([12, 18], g.xAxisRange());
assert.deepEqual([15, 20], g.yAxisRange(0));
g.updateOptions({ dateWindow : null, valueRange : null, axes: null });
assert.deepEqual([10, 20], g.xAxisRange());
assert.deepEqual([0, 55], g.yAxisRange(0));
});
/**
* Verify that when zoomed in by mouse operations, an empty call to
* updateOptions doesn't change the displayed ranges.
*/
var zoom = function(g, xRange, yRange) {
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]);
assertDeepCloseTo(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]);
assertDeepCloseTo(xRange, g.xAxisRange(), 0.2);
assertDeepCloseTo(yRange, g.yAxisRange(0), 0.2);
}
/**
* Verify that when zoomed in by mouse operations, an empty call to
* updateOptions doesn't change the displayed ranges.
*/
it('testEmptyUpdateOptions_doesntUnzoom', function() {
var g = createGraph();
zoom(g, [ 11, 18 ], [ 35, 40 ]);
assertDeepCloseTo([11, 18], g.xAxisRange(), 0.1);
assertDeepCloseTo([35, 40], g.yAxisRange(0), 0.2);
g.updateOptions({});
assertDeepCloseTo([11, 18], g.xAxisRange(), 0.1);
assertDeepCloseTo([35, 40], g.yAxisRange(0), 0.2);
});
/**
* Verify that when zoomed in by mouse operations, a call to
* updateOptions({ dateWindow : null, valueRange : null }) fully
* unzooms.
*/
it('testRestoreOriginalRanges_viaUpdateOptions', function() {
var g = createGraph();
zoom(g, [ 11, 18 ], [ 35, 40 ]);
g.updateOptions({ dateWindow : null, valueRange : null });
assert.deepEqual([0, 55], g.yAxisRange(0));
assert.deepEqual([10, 20], g.xAxisRange());
});
/**
* Verify that log scale axis range is properly specified.
*/
it('testLogScaleExcludesZero', function() {
var g = new Dygraph("graph", FIVE_TO_ONE_THOUSAND, {
logscale: true,
labels: ['X', 'Y']
});
assert.deepEqual([10, 1099], g.yAxisRange(0));
g.updateOptions({ logscale : false });
assert.deepEqual([0, 1099], g.yAxisRange(0));
});
/**
* Verify that includeZero range is properly specified.
*/
it('testIncludeZeroIncludesZero', function() {
var g = new Dygraph("graph", [[0, 500], [500, 1000]], {
includeZero: true,
labels: ['X', 'Y']
});
assert.deepEqual([0, 1100], g.yAxisRange(0));
g.updateOptions({ includeZero : false });
assert.deepEqual([450, 1050], g.yAxisRange(0));
});
/**
* Verify that includeZero range is properly specified per axis.
*/
it('testIncludeZeroPerAxis', function() {
var g = new Dygraph("graph",
'X,A,B\n'+
'0,50,50\n'+
'50,110,110\n',
{
drawPoints: true,
pointSize:5,
series:{
A: {
axis: 'y',
pointSize: 10
},
B: {
axis: 'y2'
}
},
axes: {
'y2': { includeZero: true }
}
});
assert.deepEqual([44, 116], g.yAxisRange(0));
assert.deepEqual([0, 121], g.yAxisRange(1));
g.updateOptions({
axes: {
'y2': { includeZero: false }
}
});
assert.deepEqual([44, 116], g.yAxisRange(1));
});
/**
* Verify that very large Y ranges don't break things.
*/
it('testHugeRange', function() {
var g = new Dygraph("graph", [[0, -1e120], [1, 1e230]], {
includeZero: true,
labels: ['X', 'Y']
});
assert.closeTo(1, -1e229 / g.yAxisRange(0)[0], 0.001);
assert.closeTo(1, 1.1e230 / g.yAxisRange(0)[1], 0.001);
});
/**
* Verify old-style avoidMinZero option.
*/
it('testAvoidMinZero', function() {
var g = createGraph({
avoidMinZero: true,
}, ZERO_TO_FIFTY_STEPS, [10, 20], [-5, 55]);
});
/**
* Verify ranges with user-specified padding, implicit avoidMinZero.
*/
it('testPaddingAuto', function() {
var g = createGraph({
xRangePad: 42,
yRangePad: 30
}, ZERO_TO_FIFTY_STEPS, [9, 21], [-5, 55]);
});
/**
* Verify auto range with drawAxesAtZero.
*/
it('testPaddingAutoAxisAtZero', function() {
var g = createGraph({
drawAxesAtZero: true,
}, ZERO_TO_FIFTY_STEPS, [10, 20], [0, 55]);
});
/**
* Verify user-specified range with padding and drawAxesAtZero options.
* Try explicit range matching the auto range, should have identical results.
*/
it('testPaddingRange1', function() {
var g = createGraph({
valueRange: [0, 50],
xRangePad: 42,
yRangePad: 30,
drawAxesAtZero: true
}, ZERO_TO_FIFTY_STEPS, [9, 21], [-5, 55]);
});
/**
* Verify user-specified range with padding and drawAxesAtZero options.
* User-supplied range differs from the auto range.
*/
it('testPaddingRange2', function() {
var g = createGraph({
valueRange: [10, 60],
xRangePad: 42,
yRangePad: 30,
drawAxesAtZero: true,
}, ZERO_TO_FIFTY_STEPS, [9, 21], [5, 65]);
});
/**
* Verify drawAxesAtZero and includeZero.
*/
it('testPaddingYAtZero', function() {
var g = createGraph({
includeZero: true,
xRangePad: 42,
yRangePad: 30,
drawAxesAtZero: true,
}, [
[-10, 10],
[10, 20],
[30, 50]
], [-14, 34], [-5, 55]);
});
/**
* Verify logscale, compat mode.
*/
it('testLogscaleCompat', function() {
var g = createGraph({
logscale: true
},
[[-10, 10], [10, 10], [30, 1000]],
[-10, 30], [10, 1099]);
});
/**
* Verify logscale, new mode.
*/
it('testLogscalePad', function() {
var g = createGraph({
logscale: true,
yRangePad: 30
},
[[-10, 10], [10, 10], [30, 1000]],
[-10, 30], [5.623, 1778.279]);
});
/**
* Verify scrolling all-zero region, traditional.
*/
it('testZeroScroll', function() {
var g = new Dygraph(
document.getElementById("graph"),
"X,Y\n" +
"1,0\n" +
"8,0\n" +
"9,0.1\n",
{
drawAxesAtZero: true,
animatedZooms: true,
avoidMinZero: true
});
});
/**
* Verify scrolling all-zero region, new-style.
*/
it('testZeroScroll2', function() {
var g = new Dygraph(
document.getElementById("graph"),
"X,Y\n" +
"1,0\n" +
"8,0\n" +
"9,0.1\n",
{
animatedZooms: true,
drawAxesAtZero: true,
xRangePad: 4,
yRangePad: 4
});
});
});