* @fileoverview Regression tests for range selector.
* @author paul.eric.felix@gmail.com (Paul Felix)
*/
-var RangeSelectorTestCase = TestCase("range-selector");
-RangeSelectorTestCase.prototype.setUp = function() {
- document.body.innerHTML = "<div id='graph'></div>";
-};
+import Dygraph from '../../src/dygraph';
+import * as utils from '../../src/dygraph-utils';
+import RangeSelectorPlugin from '../../src/plugins/range-selector';
-RangeSelectorTestCase.prototype.tearDown = function() {
-};
+import Util from './Util';
+import DygraphOps from './DygraphOps';
+import CanvasAssertions from './CanvasAssertions';
+import Proxy from './Proxy';
+
+describe("range-selector", function() {
+
+cleanupAfterEach();
-RangeSelectorTestCase.prototype.testRangeSelector = function() {
+var restoreConsole;
+var logs = {};
+beforeEach(function() {
+ restoreConsole = Util.captureConsole(logs);
+});
+
+afterEach(function() {
+ restoreConsole();
+});
+
+it('testRangeSelector', function() {
var opts = {
width: 480,
height: 320,
];
var graph = document.getElementById("graph");
var g = new Dygraph(graph, data, opts);
- this.assertGraphExistence(g, graph);
-};
+ assertGraphExistence(g, graph);
+});
-RangeSelectorTestCase.prototype.testRangeSelectorWithErrorBars = function() {
+it('testRangeSelectorWithErrorBars', function() {
var opts = {
width: 480,
height: 320,
];
var graph = document.getElementById("graph");
var g = new Dygraph(graph, data, opts);
- this.assertGraphExistence(g, graph);
-};
+ assertGraphExistence(g, graph);
+});
-RangeSelectorTestCase.prototype.testRangeSelectorWithCustomBars = function() {
+it('testRangeSelectorWithCustomBars', function() {
var opts = {
width: 480,
height: 320,
];
var graph = document.getElementById("graph");
var g = new Dygraph(graph, data, opts);
- this.assertGraphExistence(g, graph);
-};
+ assertGraphExistence(g, graph);
+});
-RangeSelectorTestCase.prototype.testRangeSelectorWithLogScale = function() {
+it('testRangeSelectorWithLogScale', function() {
var opts = {
width: 480,
height: 320,
];
var graph = document.getElementById("graph");
var g = new Dygraph(graph, data, opts);
- this.assertGraphExistence(g, graph);
-};
+ assertGraphExistence(g, graph);
+});
-RangeSelectorTestCase.prototype.testRangeSelectorOptions = function() {
+it('testRangeSelectorOptions', function() {
var opts = {
width: 480,
height: 320,
showRangeSelector: true,
rangeSelectorHeight: 30,
rangeSelectorPlotFillColor: 'lightyellow',
- rangeSelectorPlotStyleColor: 'yellow',
+ rangeSelectorPlotFillGradientColor: 'rgba(200, 200, 42, 10)',
labels: ['X', 'Y']
};
var data = [
];
var graph = document.getElementById("graph");
var g = new Dygraph(graph, data, opts);
- this.assertGraphExistence(g, graph);
-};
+ assertGraphExistence(g, graph);
+});
-RangeSelectorTestCase.prototype.testRangeSelectorEnablingAfterCreation = function() {
+it('testAdditionalRangeSelectorOptions', function() {
var opts = {
width: 480,
height: 320,
+ showRangeSelector: true,
+ rangeSelectorHeight: 30,
+ rangeSelectorBackgroundStrokeColor: 'blue',
+ rangeSelectorBackgroundLineWidth: 3,
+ rangeSelectorPlotLineWidth: 0.5,
+ rangeSelectorForegroundStrokeColor: 'red',
+ rangeSelectorForegroundLineWidth: 2,
+ rangeSelectorAlpha: 0.8,
labels: ['X', 'Y']
};
var data = [
];
var graph = document.getElementById("graph");
var g = new Dygraph(graph, data, opts);
+ assertGraphExistence(g, graph);
+});
+
+it('testRangeSelectorEnablingAfterCreation', function() {
+ var opts = {
+ width: 480,
+ height: 320,
+ labels: ['X', 'Y']
+ };
+ var data = [
+ [1, 10],
+ [2, 15],
+ [3, 10],
+ [4, 15],
+ [5, 10],
+ [6, 15],
+ [7, 10],
+ [8, 15],
+ [9, 10]
+ ];
+ var graph = document.getElementById("graph");
+ var g = new Dygraph(graph, data, opts);
+ var initialChartHeight = g.getArea().h;
g.updateOptions({showRangeSelector: true});
- this.assertGraphExistence(g, graph);
-};
+ assertGraphExistence(g, graph);
+ assert(g.getArea().h < initialChartHeight); // range selector shown
+
+ g.updateOptions({showRangeSelector: false});
+ assert.equal(g.getArea().h, initialChartHeight); // range selector hidden
+});
// The animatedZooms option does not work with the range selector. Make sure it gets turned off.
-RangeSelectorTestCase.prototype.testRangeSelectorWithAnimatedZoomsOption = function() {
+it('testRangeSelectorWithAnimatedZoomsOption', function() {
var opts = {
width: 480,
height: 320,
];
var graph = document.getElementById("graph");
var g = new Dygraph(graph, data, opts);
- this.assertGraphExistence(g, graph);
- assertFalse(g.getOption('animatedZooms'));
-};
+ assertGraphExistence(g, graph);
+ assert.isFalse(g.getOption('animatedZooms'));
+ assert.deepEqual(logs, {
+ log: [], error: [],
+ warn: ["Animated zooms and range selector are not compatible; disabling animatedZooms."]
+ });
+});
-RangeSelectorTestCase.prototype.testRangeSelectorWithAnimatedZoomsOption2 = function() {
+it('testRangeSelectorWithAnimatedZoomsOption2', function() {
var opts = {
width: 480,
height: 320,
var graph = document.getElementById("graph");
var g = new Dygraph(graph, data, opts);
g.updateOptions({showRangeSelector: true});
- this.assertGraphExistence(g, graph);
- assertFalse(g.getOption('animatedZooms'));
-};
+ assertGraphExistence(g, graph);
+ assert.isFalse(g.getOption('animatedZooms'));
+ assert.deepEqual(logs, {
+ log: [], error: [],
+ warn: ["Animated zooms and range selector are not compatible; disabling animatedZooms."]
+ });
+});
-RangeSelectorTestCase.prototype.testRangeSelectorInteraction = function() {
+it('testRangeSelectorInteraction', function() {
var opts = {
width: 480,
height: 320,
];
var graph = document.getElementById("graph");
var g = new Dygraph(graph, data, opts);
- this.assertGraphExistence(g, graph);
+ assertGraphExistence(g, graph);
var zoomhandles = graph.getElementsByClassName('dygraph-rangesel-zoomhandle');
// Move left zoomhandle in
zoomhandles[0].dispatchEvent(mouseUpEvent);
var newXRange = g.xAxisRange().slice();
- assert('left zoomhandle should have moved: '+newXRange[0]+'>'+xRange[0], newXRange[0] > xRange[0]);
- assertEquals('right zoomhandle should not have moved', xRange[1], newXRange[1]);
+ assert(newXRange[0] > xRange[0], 'left zoomhandle should have moved: '+newXRange[0]+'>'+xRange[0]);
+ assert.equal(xRange[1], newXRange[1], 'right zoomhandle should not have moved');
// Move right zoomhandle in
xRange = newXRange;
zoomhandles[1].dispatchEvent(mouseUpEvent);
var newXRange = g.xAxisRange().slice();
- assert('right zoomhandle should have moved: '+newXRange[1]+'<'+xRange[1], newXRange[1] < xRange[1]);
- assertEquals('left zoomhandle should not have moved', xRange[0], newXRange[0]);
+ assert(newXRange[1] < xRange[1], 'right zoomhandle should have moved: '+newXRange[1]+'<'+xRange[1]);
+ assert.equal(xRange[0], newXRange[0], 'left zoomhandle should not have moved');
// Pan left
xRange = newXRange;
fgcanvas.dispatchEvent(mouseUpEvent);
var newXRange = g.xAxisRange().slice();
- assert(newXRange[0]+'<'+xRange[0], newXRange[0] < xRange[0]);
- assert(newXRange[1]+'<'+xRange[1], newXRange[1] < xRange[1]);
-};
+ assert(newXRange[0] < xRange[0], newXRange[0]+'<'+xRange[0]);
+ assert(newXRange[1] < xRange[1], newXRange[1]+'<'+xRange[1]);
+});
-RangeSelectorTestCase.prototype.testRangeSelectorPositionIfXAxisNotDrawn = function() {
+it('testRangeSelectorPositionIfXAxisNotDrawn', function() {
var opts = {
width: 480,
height: 100,
xAxisHeight: 30,
- drawXAxis: false,
+ axes : { x : { drawAxis: false }},
showRangeSelector: true,
rangeSelectorHeight: 30,
labels: ['X', 'Y']
];
var graph = document.getElementById("graph");
var g = new Dygraph(graph, data, opts);
-
+
//assert, that the range selector is at top position 70 since the 30px of the
// xAxis shouldn't be reserved since it isn't drawn.
- this.assertGraphExistence(g, graph);
+ assertGraphExistence(g, graph);
var bgcanvas = graph.getElementsByClassName('dygraph-rangesel-bgcanvas')[0];
- assertEquals("Range selector is not at the expected position.","70px", bgcanvas.style.top);
+ assert.equal("70px", bgcanvas.style.top, "Range selector is not at the expected position.");
var fgcanvas = graph.getElementsByClassName('dygraph-rangesel-fgcanvas')[0];
- assertEquals("Range selector is not at the expected position.","70px", fgcanvas.style.top);
-};
+ assert.equal("70px", fgcanvas.style.top, "Range selector is not at the expected position.");
+});
-RangeSelectorTestCase.prototype.testMiniPlotDrawn = function() {
+it('testMiniPlotDrawn', function() {
// Install Proxy to track canvas calls.
- var origFunc = Dygraph.getContext;
+ var origFunc = utils.getContext;
var miniHtx;
- Dygraph.getContext = function(canvas) {
- console.log(canvas.className);
+ utils.getContext = function(canvas) {
if (canvas.className != 'dygraph-rangesel-bgcanvas') {
return origFunc(canvas);
}
width: 480,
height: 100,
xAxisHeight: 30,
- drawXAxis: false,
+ axes : { x : { drawAxis: false }},
showRangeSelector: true,
rangeSelectorHeight: 30,
rangeSelectorPlotStrokeColor: '#ff0000',
var g = new Dygraph(graph, data, opts);
// TODO(danvk): more precise tests.
- assertNotNull(miniHtx);
- assertTrue(0 < CanvasAssertions.numLinesDrawn(miniHtx, '#ff0000'));
+ assert.isNotNull(miniHtx);
+ assert.isTrue(0 < CanvasAssertions.numLinesDrawn(miniHtx, '#ff0000'));
- Dygraph.getContext = origFunc;
-};
+ utils.getContext = origFunc;
+});
// Tests data computation for the mini plot with a single series.
-RangeSelectorTestCase.prototype.testSingleCombinedSeries = function() {
+it('testSingleCombinedSeries', function() {
var opts = {
showRangeSelector: true,
labels: ['X', 'Y1']
var graph = document.getElementById("graph");
var g = new Dygraph(graph, data, opts);
- var rangeSelector = g.getPluginInstance_(Dygraph.Plugins.RangeSelector);
- assertNotNull(rangeSelector);
+ var rangeSelector = g.getPluginInstance_(RangeSelectorPlugin);
+ assert.isNotNull(rangeSelector);
var combinedSeries = rangeSelector.computeCombinedSeriesAndLimits_();
- assertEquals({
+ assert.deepEqual({
yMin: 1 - 7 * 0.25, // 25% padding
yMax: 8 + 7 * 0.25,
data: [
[10, 8]
]
}, combinedSeries);
-};
+});
// Tests that multiple series are averaged for the miniplot.
-RangeSelectorTestCase.prototype.testCombinedSeries = function() {
+it('testCombinedSeries', function() {
var opts = {
showRangeSelector: true,
labels: ['X', 'Y1', 'Y2']
var graph = document.getElementById("graph");
var g = new Dygraph(graph, data, opts);
- var rangeSelector = g.getPluginInstance_(Dygraph.Plugins.RangeSelector);
- assertNotNull(rangeSelector);
+ var rangeSelector = g.getPluginInstance_(RangeSelectorPlugin);
+ assert.isNotNull(rangeSelector);
var combinedSeries = rangeSelector.computeCombinedSeriesAndLimits_();
- assertEquals({
+ assert.deepEqual({
yMin: 2 - 6 * 0.25, // 25% padding on combined series range.
yMax: 8 + 6 * 0.25,
data: [
[10, 8]
]
}, combinedSeries);
-};
+});
+
+// Tests selection of a specific series to average for the mini plot.
+it('testSelectedCombinedSeries', function() {
+ var opts = {
+ showRangeSelector: true,
+ labels: ['X', 'Y1', 'Y2', 'Y3', 'Y4'],
+ series: {
+ 'Y1': { showInRangeSelector: true },
+ 'Y3': { showInRangeSelector: true }
+ }
+ };
+ var data = [
+ [0, 5, 8, 13, 21], // average (first and third) = 9
+ [5, 1, 3, 7, 14], // average (first and third) = 4
+ [10, 0, 19, 10, 6] // average (first and third) = 5
+ ];
+ var graph = document.getElementById("graph");
+ var g = new Dygraph(graph, data, opts);
+
+ var rangeSelector = g.getPluginInstance_(RangeSelectorPlugin);
+ assert.isNotNull(rangeSelector);
+
+ var combinedSeries = rangeSelector.computeCombinedSeriesAndLimits_();
+ assert.deepEqual({
+ yMin: 4 - 5 * 0.25, // 25% padding on combined series range.
+ yMax: 9 + 5 * 0.25,
+ data: [
+ [0, 9],
+ [5, 4],
+ [10, 5]
+ ]
+ }, combinedSeries);
+});
// Tests data computation for the mini plot with a single error bar series.
-RangeSelectorTestCase.prototype.testSingleCombinedSeriesCustomBars = function() {
+it('testSingleCombinedSeriesCustomBars', function() {
var opts = {
customBars: true,
showRangeSelector: true,
var graph = document.getElementById("graph");
var g = new Dygraph(graph, data, opts);
- var rangeSelector = g.getPluginInstance_(Dygraph.Plugins.RangeSelector);
- assertNotNull(rangeSelector);
+ var rangeSelector = g.getPluginInstance_(RangeSelectorPlugin);
+ assert.isNotNull(rangeSelector);
var combinedSeries = rangeSelector.computeCombinedSeriesAndLimits_();
- assertEquals({
+ assert.deepEqual({
yMin: 1 - 7 * 0.25, // 25% padding
yMax: 8 + 7 * 0.25,
data: [
[10, 8]
]
}, combinedSeries);
-};
+});
-RangeSelectorTestCase.prototype.testSingleCombinedSeriesErrorBars = function() {
+it('testSingleCombinedSeriesErrorBars', function() {
var opts = {
errorBars: true,
showRangeSelector: true,
var graph = document.getElementById("graph");
var g = new Dygraph(graph, data, opts);
- var rangeSelector = g.getPluginInstance_(Dygraph.Plugins.RangeSelector);
- assertNotNull(rangeSelector);
+ var rangeSelector = g.getPluginInstance_(RangeSelectorPlugin);
+ assert.isNotNull(rangeSelector);
var combinedSeries = rangeSelector.computeCombinedSeriesAndLimits_();
- assertEquals({
+ assert.deepEqual({
yMin: 1 - 7 * 0.25, // 25% padding
yMax: 8 + 7 * 0.25,
data: [
[10, 8]
]
}, combinedSeries);
-};
+});
// Tests data computation for the mini plot with two custom bar series.
-RangeSelectorTestCase.prototype.testTwoCombinedSeriesCustomBars = function() {
+it('testTwoCombinedSeriesCustomBars', function() {
var opts = {
customBars: true,
showRangeSelector: true,
var graph = document.getElementById("graph");
var g = new Dygraph(graph, data, opts);
- var rangeSelector = g.getPluginInstance_(Dygraph.Plugins.RangeSelector);
- assertNotNull(rangeSelector);
+ var rangeSelector = g.getPluginInstance_(RangeSelectorPlugin);
+ assert.isNotNull(rangeSelector);
var combinedSeries = rangeSelector.computeCombinedSeriesAndLimits_();
- assertEquals({
+ assert.deepEqual({
yMin: 3 - 7 * 0.25, // 25% padding
yMax: 10 + 7 * 0.25,
data: [
[10, 10]
]
}, combinedSeries);
-};
+});
+
+it('testHiddenSeriesExcludedFromMiniplot', function() {
+ var opts = {
+ showRangeSelector: true,
+ labels: ['X', 'Y1', 'Y2'],
+ visibility: [true, false]
+ };
+ var data = [
+ [0, 1, 3], // average = 2
+ [5, 4, 6], // average = 5
+ [10, 7, 9] // average = 8
+ ];
+ var graph = document.getElementById("graph");
+ var g = new Dygraph(graph, data, opts);
+ var rangeSelector = g.getPluginInstance_(RangeSelectorPlugin);
+ assert.isNotNull(rangeSelector);
-RangeSelectorTestCase.prototype.assertGraphExistence = function(g, graph) {
- assertNotNull(g);
+ // Invisible series (e.g. Y2) are not included in the combined series.
+ var combinedSeries = rangeSelector.computeCombinedSeriesAndLimits_();
+ assert.deepEqual({
+ yMin: 1 - 6 * 0.25, // 25% padding on single series range.
+ yMax: 7 + 6 * 0.25,
+ data: [
+ [0, 1],
+ [5, 4],
+ [10, 7]
+ ]
+ }, combinedSeries);
+
+ // If Y2 is explicitly marked to be included in the range selector,
+ // then it will be (even if it's not visible). Since we've started being
+ // explicit about marking series for inclusion, this means that Y1 is no
+ // longer included.
+ g.updateOptions({
+ series: {
+ Y2: { showInRangeSelector: true },
+ }
+ });
+ combinedSeries = rangeSelector.computeCombinedSeriesAndLimits_();
+ assert.deepEqual({
+ yMin: 3 - 6 * 0.25, // 25% padding on combined series range.
+ yMax: 9 + 6 * 0.25,
+ data: [
+ [0, 3],
+ [5, 6],
+ [10, 9]
+ ]
+ }, combinedSeries);
+
+ // If we explicitly mark Y1, too, then it also gets included.
+ g.updateOptions({
+ series: {
+ Y1: { showInRangeSelector: true },
+ Y2: { showInRangeSelector: true },
+ }
+ });
+ combinedSeries = rangeSelector.computeCombinedSeriesAndLimits_();
+ assert.deepEqual({
+ yMin: 2 - 6 * 0.25, // 25% padding on combined series range.
+ yMax: 8 + 6 * 0.25,
+ data: [
+ [0, 2],
+ [5, 5],
+ [10, 8]
+ ]
+ }, combinedSeries);
+});
+
+var assertGraphExistence = function(g, graph) {
+ assert.isNotNull(g);
var zoomhandles = graph.getElementsByClassName('dygraph-rangesel-zoomhandle');
- assertEquals(2, zoomhandles.length);
+ assert.equal(2, zoomhandles.length);
var bgcanvas = graph.getElementsByClassName('dygraph-rangesel-bgcanvas');
- assertEquals(1, bgcanvas.length);
+ assert.equal(1, bgcanvas.length);
var fgcanvas = graph.getElementsByClassName('dygraph-rangesel-fgcanvas');
- assertEquals(1, fgcanvas.length);
-}
+ assert.equal(1, fgcanvas.length);
+};
+
+});