/* eslint-disable */
/* global $, describe, it, xit, xdescribe, after, afterEach, expect*/
describe("flot navigate plugin interactions", function () {
'use strict';
var placeholder, plot, eventHolder;
var options = {
xaxes: [{
autoScale: 'exact'
}],
yaxes: [{
autoScale: 'exact'
}],
zoom: {
interactive: true,
active: true,
amount: 10
},
pan: {
interactive: true,
active: true
}
};
beforeEach(function () {
placeholder = setFixtures('
')
.find('#test-container');
jasmine.clock().install();
});
afterEach(function () {
jasmine.clock().uninstall();
});
it('do smart pans on mouse drag by default', function () {
var oldFrameRate = options.pan.frameRate;
options.pan.frameRate = -1;
plot = $.plot(placeholder, [
[[0, 0],
[10, 10]]
], options);
eventHolder = plot.getEventHolder();
var xaxis = plot.getXAxes()[0];
var yaxis = plot.getYAxes()[0];
// drag almost horizontally snap to x direction
simulate.mouseDown(eventHolder, 50, 70);
simulate.mouseMove(eventHolder, 50, 70);
simulate.mouseMove(eventHolder, 50 + plot.width(), 80);
expect(xaxis.min).toBe(-10);
expect(xaxis.max).toBe(0);
expect(yaxis.min).toBe(0);
expect(yaxis.max).toBe(10);
simulate.mouseUp(eventHolder, 50 + plot.width(), 80);
expect(xaxis.min).toBe(-10);
expect(xaxis.max).toBe(0);
expect(yaxis.min).toBe(0);
expect(yaxis.max).toBe(10);
// drag almost vertically snap to y direction
simulate.mouseDown(eventHolder, 50, 70);
simulate.mouseMove(eventHolder, 50, 70);
simulate.mouseMove(eventHolder, 60, 70 + plot.height());
expect(xaxis.min).toBe(-10);
expect(xaxis.max).toBe(0);
expect(yaxis.min).toBe(10);
expect(yaxis.max).toBe(20);
simulate.mouseUp(eventHolder, 60, 70 + plot.height());
expect(xaxis.min).toBe(-10);
expect(xaxis.max).toBe(0);
expect(yaxis.min).toBe(10);
expect(yaxis.max).toBe(20);
// cover finite frame rate case
plot.destroy();
options.pan.frameRate = 10;
plot = $.plot(placeholder, [
[[0, 0],
[10, 10]]
], options);
eventHolder = plot.getEventHolder();
xaxis = plot.getXAxes()[0];
yaxis = plot.getYAxes()[0];
// drag diagonally do not snap
simulate.mouseDown(eventHolder, plot.width() - 50, plot.height() - 70);
simulate.mouseMove(eventHolder, plot.width() - 50, plot.height() - 70);
jasmine.clock().tick(100);
simulate.mouseMove(eventHolder, -50, -70);
jasmine.clock().tick(100);
expect(xaxis.min).toBe(10);
expect(xaxis.max).toBe(20);
expect(yaxis.min).toBe(-10);
expect(yaxis.max).toBe(0);
simulate.mouseUp(eventHolder, -50, -70);
expect(xaxis.min).toBe(10);
expect(xaxis.max).toBe(20);
expect(yaxis.min).toBe(-10);
expect(yaxis.max).toBe(0);
options.pan.frameRate = oldFrameRate;
});
it('do non-smart pans on mouse drag in non-smart pan mode', function () {
var oldPanMode = options.pan.mode;
options.pan.mode = 'manual';
var oldFrameRate = options.pan.frameRate;
options.pan.frameRate = -1;
plot = $.plot(placeholder, [
[[0, 0],
[10, 10]]
], options);
eventHolder = plot.getEventHolder();
var xaxis = plot.getXAxes()[0];
var yaxis = plot.getYAxes()[0];
// drag almost horizontally do not snap
var movement = { x: [50, 50 + plot.width()], y: [70, 80] };
simulate.mouseDown(eventHolder, movement.x[0], movement.y[0]);
simulate.mouseMove(eventHolder, movement.x[0], movement.y[0]);
simulate.mouseMove(eventHolder, movement.x[1], movement.y[1]);
expect(xaxis.min).toBe(-10);
expect(xaxis.max).toBe(0);
expect(yaxis.min).toBeGreaterThan(0);
expect(yaxis.max).toBeGreaterThan(10);
simulate.mouseUp(eventHolder, movement.x[1], movement.y[1]);
// cover finite frame rate case
plot.destroy();
options.pan.frameRate = 10;
plot = $.plot(placeholder, [
[[0, 0],
[10, 10]]
], options);
eventHolder = plot.getEventHolder();
xaxis = plot.getXAxes()[0];
yaxis = plot.getYAxes()[0];
// drag almost vertically do not snap
movement = { x: [50, 60], y: [70, 70 + plot.height()] };
simulate.mouseDown(eventHolder, movement.x[0], movement.y[0]);
simulate.mouseMove(eventHolder, movement.x[0], movement.y[0]);
jasmine.clock().tick(100);
simulate.mouseMove(eventHolder, movement.x[1], movement.y[1]);
jasmine.clock().tick(100);
expect(xaxis.min).toBeLessThan(0);
expect(xaxis.max).toBeLessThan(10);
expect(yaxis.min).toBe(10);
expect(yaxis.max).toBe(20);
simulate.mouseUp(eventHolder, movement.x[1], movement.y[1]);
options.pan.mode = oldPanMode;
options.pan.frameRate = oldFrameRate;
});
it('lock smart pan snap direction on mouse drag in smart-lock pan mode', function () {
var oldPanMode = options.pan.mode;
options.pan.mode = 'smartLock';
var oldFrameRate = options.pan.frameRate;
options.pan.frameRate = -1;
plot = $.plot(placeholder, [
[[0, 0],
[10, 10]]
], options);
eventHolder = plot.getEventHolder();
var xaxis = plot.getXAxes()[0];
var yaxis = plot.getYAxes()[0];
var initialXmin = xaxis.min,
initialXmax = xaxis.max,
initialYmin = yaxis.min,
initialYmax = yaxis.max;
// drag almost horizontally then vertically snap to x direction
simulate.mouseDown(eventHolder, 50, 70);
simulate.mouseMove(eventHolder, 50, 70);
simulate.mouseMove(eventHolder, 50 + plot.width() / 2, 80);
simulate.mouseMove(eventHolder, 50 + plot.width(), 70 + plot.height());
simulate.mouseUp(eventHolder, 50 + plot.width(), 70 + plot.height());
expect(xaxis.min).toBeLessThan(initialXmin);
expect(xaxis.max).toBeLessThan(initialXmax);
expect(yaxis.min).toBe(initialYmin);
expect(yaxis.max).toBe(initialYmax);
// drag almost vertically then horizontally snap to y direction
plot.recenter({});
simulate.mouseDown(eventHolder, 50, 70);
simulate.mouseMove(eventHolder, 50, 70);
simulate.mouseMove(eventHolder, 60, 70 + plot.height());
simulate.mouseMove(eventHolder, 50 + plot.width(), 70 + plot.height());
simulate.mouseUp(eventHolder, 50 + plot.width(), 70 + plot.height());
expect(xaxis.min).toBe(initialXmin);
expect(xaxis.max).toBe(initialXmax);
expect(yaxis.min).toBeGreaterThan(initialYmin);
expect(yaxis.max).toBeGreaterThan(initialYmax);
options.pan.mode = oldPanMode;
options.pan.frameRate = oldFrameRate;
});
it('do not move graph on mouse drag if pan mode is invalid', function () {
var oldPanMode = options.pan.mode;
options.pan.mode = '';
var oldFrameRate = options.pan.frameRate;
options.pan.frameRate = -1;
plot = $.plot(placeholder, [
[[0, 0],
[10, 10]]
], options);
eventHolder = plot.getEventHolder();
var xaxis = plot.getXAxes()[0];
var yaxis = plot.getYAxes()[0];
var initialXmin = xaxis.min,
initialXmax = xaxis.max,
initialYmin = yaxis.min,
initialYmax = yaxis.max;
// do not drag in all cases
simulate.mouseDown(eventHolder, 50, 70);
simulate.mouseMove(eventHolder, 50, 70);
simulate.mouseMove(eventHolder, 50 + plot.width() / 2, 70);
simulate.mouseUp(eventHolder, 50 + plot.width(), 70);
expect(xaxis.min).toBe(initialXmin);
expect(xaxis.max).toBe(initialXmax);
expect(yaxis.min).toBe(initialYmin);
expect(yaxis.max).toBe(initialYmax);
simulate.mouseDown(eventHolder, 50, 70);
simulate.mouseMove(eventHolder, 50, 70);
simulate.mouseMove(eventHolder, 50, 70 + plot.height());
simulate.mouseUp(eventHolder, 50, 70 + plot.height());
expect(xaxis.min).toBe(initialXmin);
expect(xaxis.max).toBe(initialXmax);
expect(yaxis.min).toBe(initialYmin);
expect(yaxis.max).toBe(initialYmax);
options.pan.mode = oldPanMode;
options.pan.frameRate = oldFrameRate;
});
it('zooms out on mouse scroll down', function () {
plot = $.plot(placeholder, [
[[0, 0],
[10, 10]]
], options);
var xaxis = plot.getXAxes()[0];
var yaxis = plot.getYAxes()[0];
var clientX = plot.getPlotOffset().left + xaxis.p2c(0);
var clientY = plot.getPlotOffset().top + yaxis.p2c(0);
eventHolder = plot.getEventHolder();
simulate.mouseWheel(eventHolder, clientX, clientY, 0, 100);
/*
I would really like better precission but:
* the browsers may place the graph to fractional pixel coordinates
* we can only deliver mouse events at integer coordinates
* so we can't align precisely our mouse clicks with a point specified in plot coordinates
hence our precission sucks.
But this test isn't about precission, so we are fine
*/
expect(xaxis.min).toBeCloseTo(0, 0);
expect(xaxis.max).toBeCloseTo(100, 0);
expect(yaxis.min).toBeCloseTo(0, 0);
expect(yaxis.max).toBeCloseTo(100, 0);
});
it('zooms in on mouse scroll up', function () {
plot = $.plot(placeholder, [
[[0, 0],
[10, 10]]
], options);
var xaxis = plot.getXAxes()[0];
var yaxis = plot.getYAxes()[0];
var clientX = plot.getPlotOffset().left + xaxis.p2c(0);
var clientY = plot.getPlotOffset().top + yaxis.p2c(0);
eventHolder = plot.getEventHolder();
simulate.mouseWheel(eventHolder, clientX, clientY, 0, -100);
/*
I would really like better precission but:
* the browsers may place the graph to fractional pixel coordinates
* we can only deliver mouse events at integer coordinates
* so we can't align precisely our mouse clicks with a point specified in plot coordinates
hence our precission sucks.
But this test isn't about precission, so we are fine
*/
expect(xaxis.min).toBeCloseTo(0, 1);
expect(xaxis.max).toBeCloseTo(1, 1);
expect(yaxis.min).toBeCloseTo(0, 1);
expect(yaxis.max).toBeCloseTo(1, 1);
});
it('constrains the mouse scroll zoom to the hovered axis ', function () {
plot = $.plot(placeholder, [
[[0, 0],
[10, 10]]
], options);
var xaxis = plot.getXAxes()[0];
var yaxis = plot.getYAxes()[0];
var clientX = plot.getPlotOffset().left + xaxis.p2c(0);
var clientY = xaxis.box.top + xaxis.box.height/2;
eventHolder = plot.getEventHolder();
simulate.mouseWheel(eventHolder, clientX, clientY, 0, -100);
expect(xaxis.min).toBeCloseTo(0, 1);
expect(xaxis.max).toBeCloseTo(1, 1);
expect(yaxis.min).toBeCloseTo(0, 1);
expect(yaxis.max).toBeCloseTo(10, 1);
});
it('zooms out proportional with the deltaY on Mac platforms', function () {
var smallAmount = 0.4,
largerAmount = 0.8,
plot1Ranges = plotAndScroll(smallAmount),
plot2Ranges = plotAndScroll(largerAmount);
expect(plot1Ranges.xaxisMin).toBeLessThan(plot2Ranges.xaxisMin);
expect(plot1Ranges.xaxisMax).toBeGreaterThan(plot2Ranges.xaxisMax);
expect(plot1Ranges.yaxisMin).toBeLessThan(plot2Ranges.yaxisMin);
expect(plot1Ranges.yaxisMax).toBeGreaterThan(plot2Ranges.yaxisMax);
});
it('zooms out regardless the deltaY value on non Mac platforms', function () {
var smallAmount = 40,
largerAmount = 80,
plot1Ranges = plotAndScroll(smallAmount),
plot2Ranges = plotAndScroll(largerAmount);
expect(plot2Ranges.xaxisMin).toBeCloseTo(plot1Ranges.xaxisMin);
expect(plot2Ranges.xaxisMax).toBeCloseTo(plot1Ranges.xaxisMax);
expect(plot2Ranges.yaxisMin).toBeCloseTo(plot1Ranges.yaxisMin);
expect(plot2Ranges.yaxisMax).toBeCloseTo(plot1Ranges.yaxisMax);
});
function plotAndScroll(amount) {
plot = $.plot(placeholder, [
[[0, 0],
[10, 10]]
], options);
var xaxis = plot.getXAxes()[0];
var yaxis = plot.getYAxes()[0];
var clientX = plot.getPlotOffset().left + xaxis.p2c(5);
var clientY = plot.getPlotOffset().top + yaxis.p2c(5);
eventHolder = plot.getEventHolder();
simulate.mouseWheel(eventHolder, clientX, clientY, 0, amount);
return {
xaxisMin: xaxis.min,
xaxisMax: xaxis.max,
yaxisMin: yaxis.min,
yaxisMax: yaxis.max
};
}
it('zooms mode handles event on mouse dblclick', function () {
plot = $.plot(placeholder, [
[[0, 0],
[10, 10]]
], {
xaxes: [{
autoScale: 'exact'
}],
yaxes: [{
autoScale: 'exact'
}],
zoom: {
interactive: false,
highlighted: true
},
pan: {
interactive: true,
highlighted: true
},
selection: {
mode: 'smart',
}});
var xaxis = plot.getXAxes()[0];
var yaxis = plot.getYAxes()[0];
var clientX = plot.getPlotOffset().left + xaxis.p2c(0);
var clientY = plot.getPlotOffset().top + yaxis.p2c(0);
eventHolder = plot.getEventHolder();
var spy = spyOn(eventHolder, 'ondblclick').and.callThrough();
var spyRecenter = jasmine.createSpy('spy');
$(plot.getPlaceholder()).on('re-center', spyRecenter);
simulate.dblclick(eventHolder, 10, 20);
expect(spy).toHaveBeenCalled();
expect(spyRecenter).toHaveBeenCalled();
});
it('shows that the eventHolder is cleared through shutdown when the plot is replaced', function() {
plot = $.plot(placeholder, [[]], options);
var eventHolder = plot.getEventHolder(),
spy = spyOn(eventHolder, 'removeEventListener').and.callThrough();
plot = $.plot(placeholder, [[]], options);
expect(spy).toHaveBeenCalledWith('mousewheel', jasmine.any(Function), jasmine.any(Boolean))
expect(spy).toHaveBeenCalledWith('dblclick', jasmine.any(Function), jasmine.any(Boolean));
});
it('do recenter for double click by default', () => {
plot = $.plot(placeholder, [
[[0, 0], [10, 10]]
], {
xaxes: [{ autoScale: 'exact' }],
yaxes: [{ autoScale: 'exact' }],
});
var eventHolder = plot.getEventHolder(),
xaxis = plot.getXAxes()[0],
yaxis = plot.getYAxes()[0],
spyRecenter = jasmine.createSpy('spy');
$(plot.getPlaceholder()).on('re-center', spyRecenter);
plot.pan({ left: 10, top: 10});
simulate.dblclick(eventHolder, 200, 150);
expect(xaxis.options.offset).toEqual({ below: 0, above: 0 });
expect(yaxis.options.offset).toEqual({ below: 0, above: 0 });
expect(spyRecenter).toHaveBeenCalled();
});
it('do not recenter for double click if recenter is disabled', () => {
plot = $.plot(placeholder, [
[[0, 0], [10, 10]]
], {
xaxes: [{ autoScale: 'exact' }],
yaxes: [{ autoScale: 'exact' }],
pan: { interactive: true },
zoom: { interactive: true },
recenter: { interactive: false },
});
var eventHolder = plot.getEventHolder(),
xaxis = plot.getXAxes()[0],
yaxis = plot.getYAxes()[0],
spyRecenter = jasmine.createSpy('spy');
$(plot.getPlaceholder()).on('re-center', spyRecenter);
plot.pan({ left: 10, top: 10});
simulate.dblclick(eventHolder, 200, 150);
expect(xaxis.options.offset).not.toEqual({ below: 0, above: 0 });
expect(yaxis.options.offset).not.toEqual({ below: 0, above: 0 });
expect(spyRecenter).not.toHaveBeenCalled();
});
});