123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739 |
- // Tests of the interaction handlers in Core.Interaction
- // Test the rectangle element
- describe('Core.Interaction', function() {
- describe('point mode', function() {
- beforeEach(function() {
- this.chart = window.acquireChart({
- type: 'line',
- data: {
- datasets: [{
- label: 'Dataset 1',
- data: [10, 20, 30],
- pointHoverBorderColor: 'rgb(255, 0, 0)',
- pointHoverBackgroundColor: 'rgb(0, 255, 0)'
- }, {
- label: 'Dataset 2',
- data: [40, 20, 40],
- pointHoverBorderColor: 'rgb(0, 0, 255)',
- pointHoverBackgroundColor: 'rgb(0, 255, 255)'
- }],
- labels: ['Point 1', 'Point 2', 'Point 3']
- }
- });
- });
- it ('should return all items under the point', function() {
- var chart = this.chart;
- var meta0 = chart.getDatasetMeta(0);
- var meta1 = chart.getDatasetMeta(1);
- var point = meta0.data[1];
- var evt = {
- type: 'click',
- chart: chart,
- native: true, // needed otherwise things its a DOM event
- x: point._model.x,
- y: point._model.y,
- };
- var elements = Chart.Interaction.modes.point(chart, evt);
- expect(elements).toEqual([point, meta1.data[1]]);
- });
- it ('should return an empty array when no items are found', function() {
- var chart = this.chart;
- var evt = {
- type: 'click',
- chart: chart,
- native: true, // needed otherwise things its a DOM event
- x: 0,
- y: 0
- };
- var elements = Chart.Interaction.modes.point(chart, evt);
- expect(elements).toEqual([]);
- });
- });
- describe('index mode', function() {
- describe('intersect: true', function() {
- beforeEach(function() {
- this.chart = window.acquireChart({
- type: 'line',
- data: {
- datasets: [{
- label: 'Dataset 1',
- data: [10, 20, 30],
- pointHoverBorderColor: 'rgb(255, 0, 0)',
- pointHoverBackgroundColor: 'rgb(0, 255, 0)'
- }, {
- label: 'Dataset 2',
- data: [40, 40, 40],
- pointHoverBorderColor: 'rgb(0, 0, 255)',
- pointHoverBackgroundColor: 'rgb(0, 255, 255)'
- }],
- labels: ['Point 1', 'Point 2', 'Point 3']
- }
- });
- });
- it ('gets correct items', function() {
- var chart = this.chart;
- var meta0 = chart.getDatasetMeta(0);
- var meta1 = chart.getDatasetMeta(1);
- var point = meta0.data[1];
- var evt = {
- type: 'click',
- chart: chart,
- native: true, // needed otherwise things its a DOM event
- x: point._model.x,
- y: point._model.y,
- };
- var elements = Chart.Interaction.modes.index(chart, evt, {intersect: true});
- expect(elements).toEqual([point, meta1.data[1]]);
- });
- it ('returns empty array when nothing found', function() {
- var chart = this.chart;
- var evt = {
- type: 'click',
- chart: chart,
- native: true, // needed otherwise things its a DOM event
- x: 0,
- y: 0,
- };
- var elements = Chart.Interaction.modes.index(chart, evt, {intersect: true});
- expect(elements).toEqual([]);
- });
- });
- describe ('intersect: false', function() {
- var data = {
- datasets: [{
- label: 'Dataset 1',
- data: [10, 20, 30],
- pointHoverBorderColor: 'rgb(255, 0, 0)',
- pointHoverBackgroundColor: 'rgb(0, 255, 0)'
- }, {
- label: 'Dataset 2',
- data: [40, 40, 40],
- pointHoverBorderColor: 'rgb(0, 0, 255)',
- pointHoverBackgroundColor: 'rgb(0, 255, 255)'
- }],
- labels: ['Point 1', 'Point 2', 'Point 3']
- };
- beforeEach(function() {
- this.chart = window.acquireChart({
- type: 'line',
- data: data
- });
- });
- it ('axis: x gets correct items', function() {
- var chart = this.chart;
- var meta0 = chart.getDatasetMeta(0);
- var meta1 = chart.getDatasetMeta(1);
- var evt = {
- type: 'click',
- chart: chart,
- native: true, // needed otherwise things its a DOM event
- x: 0,
- y: 0
- };
- var elements = Chart.Interaction.modes.index(chart, evt, {intersect: false});
- expect(elements).toEqual([meta0.data[0], meta1.data[0]]);
- });
- it ('axis: y gets correct items', function() {
- var chart = window.acquireChart({
- type: 'horizontalBar',
- data: data
- });
- var meta0 = chart.getDatasetMeta(0);
- var meta1 = chart.getDatasetMeta(1);
- var center = meta0.data[0].getCenterPoint();
- var evt = {
- type: 'click',
- chart: chart,
- native: true, // needed otherwise things its a DOM event
- x: center.x,
- y: center.y + 30,
- };
- var elements = Chart.Interaction.modes.index(chart, evt, {axis: 'y', intersect: false});
- expect(elements).toEqual([meta0.data[0], meta1.data[0]]);
- });
- it ('axis: xy gets correct items', function() {
- var chart = this.chart;
- var meta0 = chart.getDatasetMeta(0);
- var meta1 = chart.getDatasetMeta(1);
- var evt = {
- type: 'click',
- chart: chart,
- native: true, // needed otherwise things its a DOM event
- x: 0,
- y: 0
- };
- var elements = Chart.Interaction.modes.index(chart, evt, {axis: 'xy', intersect: false});
- expect(elements).toEqual([meta0.data[0], meta1.data[0]]);
- });
- });
- });
- describe('dataset mode', function() {
- describe('intersect: true', function() {
- beforeEach(function() {
- this.chart = window.acquireChart({
- type: 'line',
- data: {
- datasets: [{
- label: 'Dataset 1',
- data: [10, 20, 30],
- pointHoverBorderColor: 'rgb(255, 0, 0)',
- pointHoverBackgroundColor: 'rgb(0, 255, 0)'
- }, {
- label: 'Dataset 2',
- data: [40, 40, 40],
- pointHoverBorderColor: 'rgb(0, 0, 255)',
- pointHoverBackgroundColor: 'rgb(0, 255, 255)'
- }],
- labels: ['Point 1', 'Point 2', 'Point 3']
- }
- });
- });
- it ('should return all items in the dataset of the first item found', function() {
- var chart = this.chart;
- var meta = chart.getDatasetMeta(0);
- var point = meta.data[1];
- var evt = {
- type: 'click',
- chart: chart,
- native: true, // needed otherwise things its a DOM event
- x: point._model.x,
- y: point._model.y
- };
- var elements = Chart.Interaction.modes.dataset(chart, evt, {intersect: true});
- expect(elements).toEqual(meta.data);
- });
- it ('should return an empty array if nothing found', function() {
- var chart = this.chart;
- var evt = {
- type: 'click',
- chart: chart,
- native: true, // needed otherwise things its a DOM event
- x: 0,
- y: 0
- };
- var elements = Chart.Interaction.modes.dataset(chart, evt, {intersect: true});
- expect(elements).toEqual([]);
- });
- });
- describe('intersect: false', function() {
- var data = {
- datasets: [{
- label: 'Dataset 1',
- data: [10, 20, 30],
- pointHoverBorderColor: 'rgb(255, 0, 0)',
- pointHoverBackgroundColor: 'rgb(0, 255, 0)'
- }, {
- label: 'Dataset 2',
- data: [40, 40, 40],
- pointHoverBorderColor: 'rgb(0, 0, 255)',
- pointHoverBackgroundColor: 'rgb(0, 255, 255)'
- }],
- labels: ['Point 1', 'Point 2', 'Point 3']
- };
- beforeEach(function() {
- this.chart = window.acquireChart({
- type: 'line',
- data: data
- });
- });
- it ('axis: x gets correct items', function() {
- var chart = window.acquireChart({
- type: 'horizontalBar',
- data: data
- });
- var evt = {
- type: 'click',
- chart: chart,
- native: true, // needed otherwise things its a DOM event
- x: 0,
- y: 0
- };
- var elements = Chart.Interaction.modes.dataset(chart, evt, {axis: 'x', intersect: false});
- var meta = chart.getDatasetMeta(0);
- expect(elements).toEqual(meta.data);
- });
- it ('axis: y gets correct items', function() {
- var chart = this.chart;
- var evt = {
- type: 'click',
- chart: chart,
- native: true, // needed otherwise things its a DOM event
- x: 0,
- y: 0
- };
- var elements = Chart.Interaction.modes.dataset(chart, evt, {axis: 'y', intersect: false});
- var meta = chart.getDatasetMeta(1);
- expect(elements).toEqual(meta.data);
- });
- it ('axis: xy gets correct items', function() {
- var chart = this.chart;
- var evt = {
- type: 'click',
- chart: chart,
- native: true, // needed otherwise things its a DOM event
- x: 0,
- y: 0
- };
- var elements = Chart.Interaction.modes.dataset(chart, evt, {intersect: false});
- var meta = chart.getDatasetMeta(1);
- expect(elements).toEqual(meta.data);
- });
- });
- });
- describe('nearest mode', function() {
- describe('intersect: false', function() {
- beforeEach(function() {
- this.chart = window.acquireChart({
- type: 'line',
- data: {
- datasets: [{
- label: 'Dataset 1',
- data: [10, 40, 30],
- pointRadius: [5, 5, 5],
- pointHoverBorderColor: 'rgb(255, 0, 0)',
- pointHoverBackgroundColor: 'rgb(0, 255, 0)'
- }, {
- label: 'Dataset 2',
- data: [40, 40, 40],
- pointRadius: [10, 10, 10],
- pointHoverBorderColor: 'rgb(0, 0, 255)',
- pointHoverBackgroundColor: 'rgb(0, 255, 255)'
- }],
- labels: ['Point 1', 'Point 2', 'Point 3']
- }
- });
- });
- it ('axis: xy should return the nearest item', function() {
- var chart = this.chart;
- var evt = {
- type: 'click',
- chart: chart,
- native: true, // needed otherwise things its a DOM event
- x: 0,
- y: 0
- };
- // Nearest to 0,0 (top left) will be first point of dataset 2
- var elements = Chart.Interaction.modes.nearest(chart, evt, {intersect: false});
- var meta = chart.getDatasetMeta(1);
- expect(elements).toEqual([meta.data[0]]);
- });
- it ('should return the smallest item if more than 1 are at the same distance', function() {
- var chart = this.chart;
- var meta0 = chart.getDatasetMeta(0);
- var meta1 = chart.getDatasetMeta(1);
- // Halfway between 2 mid points
- var pt = {
- x: meta0.data[1]._view.x,
- y: (meta0.data[1]._view.y + meta1.data[1]._view.y) / 2
- };
- var evt = {
- type: 'click',
- chart: chart,
- native: true, // needed otherwise things its a DOM event
- x: pt.x,
- y: pt.y
- };
- // Nearest to 0,0 (top left) will be first point of dataset 2
- var elements = Chart.Interaction.modes.nearest(chart, evt, {intersect: false});
- expect(elements).toEqual([meta0.data[1]]);
- });
- it ('should return the lowest dataset index if size and area are the same', function() {
- var chart = this.chart;
- // Make equal sized points at index: 1
- chart.data.datasets[0].pointRadius[1] = 10;
- chart.update();
- // Trigger an event over top of the
- var meta0 = chart.getDatasetMeta(0);
- var meta1 = chart.getDatasetMeta(1);
- // Halfway between 2 mid points
- var pt = {
- x: meta0.data[1]._view.x,
- y: (meta0.data[1]._view.y + meta1.data[1]._view.y) / 2
- };
- var evt = {
- type: 'click',
- chart: chart,
- native: true, // needed otherwise things its a DOM event
- x: pt.x,
- y: pt.y
- };
- // Nearest to 0,0 (top left) will be first point of dataset 2
- var elements = Chart.Interaction.modes.nearest(chart, evt, {intersect: false});
- expect(elements).toEqual([meta0.data[1]]);
- });
- });
- describe('intersect: true', function() {
- beforeEach(function() {
- this.chart = window.acquireChart({
- type: 'line',
- data: {
- datasets: [{
- label: 'Dataset 1',
- data: [10, 20, 30],
- pointHoverBorderColor: 'rgb(255, 0, 0)',
- pointHoverBackgroundColor: 'rgb(0, 255, 0)'
- }, {
- label: 'Dataset 2',
- data: [40, 40, 40],
- pointHoverBorderColor: 'rgb(0, 0, 255)',
- pointHoverBackgroundColor: 'rgb(0, 255, 255)'
- }],
- labels: ['Point 1', 'Point 2', 'Point 3']
- }
- });
- });
- it ('should return the nearest item', function() {
- var chart = this.chart;
- var meta = chart.getDatasetMeta(1);
- var point = meta.data[1];
- var evt = {
- type: 'click',
- chart: chart,
- native: true, // needed otherwise things its a DOM event
- x: point._view.x + 15,
- y: point._view.y
- };
- // Nothing intersects so find nothing
- var elements = Chart.Interaction.modes.nearest(chart, evt, {intersect: true});
- expect(elements).toEqual([]);
- evt = {
- type: 'click',
- chart: chart,
- native: true,
- x: point._view.x,
- y: point._view.y
- };
- elements = Chart.Interaction.modes.nearest(chart, evt, {intersect: true});
- expect(elements).toEqual([point]);
- });
- it ('should return the nearest item even if 2 intersect', function() {
- var chart = this.chart;
- chart.data.datasets[0].pointRadius = [5, 30, 5];
- chart.data.datasets[0].data[1] = 39;
- chart.data.datasets[1].pointRadius = [10, 10, 10];
- // Trigger an event over top of the
- var meta0 = chart.getDatasetMeta(0);
- // Halfway between 2 mid points
- var pt = {
- x: meta0.data[1]._view.x,
- y: meta0.data[1]._view.y
- };
- var evt = {
- type: 'click',
- chart: chart,
- native: true, // needed otherwise things its a DOM event
- x: pt.x,
- y: pt.y
- };
- var elements = Chart.Interaction.modes.nearest(chart, evt, {intersect: true});
- expect(elements).toEqual([meta0.data[1]]);
- });
- it ('should return the smallest item if more than 1 are at the same distance', function() {
- var chart = this.chart;
- chart.data.datasets[0].pointRadius = [5, 5, 5];
- chart.data.datasets[0].data[1] = 40;
- chart.data.datasets[1].pointRadius = [10, 10, 10];
- // Trigger an event over top of the
- var meta0 = chart.getDatasetMeta(0);
- // Halfway between 2 mid points
- var pt = {
- x: meta0.data[1]._view.x,
- y: meta0.data[1]._view.y
- };
- var evt = {
- type: 'click',
- chart: chart,
- native: true, // needed otherwise things its a DOM event
- x: pt.x,
- y: pt.y
- };
- var elements = Chart.Interaction.modes.nearest(chart, evt, {intersect: true});
- expect(elements).toEqual([meta0.data[1]]);
- });
- it ('should return the item at the lowest dataset index if distance and area are the same', function() {
- var chart = this.chart;
- chart.data.datasets[0].pointRadius = [5, 10, 5];
- chart.data.datasets[0].data[1] = 40;
- chart.data.datasets[1].pointRadius = [10, 10, 10];
- // Trigger an event over top of the
- var meta0 = chart.getDatasetMeta(0);
- // Halfway between 2 mid points
- var pt = {
- x: meta0.data[1]._view.x,
- y: meta0.data[1]._view.y
- };
- var evt = {
- type: 'click',
- chart: chart,
- native: true, // needed otherwise things its a DOM event
- x: pt.x,
- y: pt.y
- };
- // Nearest to 0,0 (top left) will be first point of dataset 2
- var elements = Chart.Interaction.modes.nearest(chart, evt, {intersect: true});
- expect(elements).toEqual([meta0.data[1]]);
- });
- });
- });
- describe('x mode', function() {
- beforeEach(function() {
- this.chart = window.acquireChart({
- type: 'line',
- data: {
- datasets: [{
- label: 'Dataset 1',
- data: [10, 40, 30],
- pointRadius: [5, 10, 5],
- pointHoverBorderColor: 'rgb(255, 0, 0)',
- pointHoverBackgroundColor: 'rgb(0, 255, 0)'
- }, {
- label: 'Dataset 2',
- data: [40, 40, 40],
- pointRadius: [10, 10, 10],
- pointHoverBorderColor: 'rgb(0, 0, 255)',
- pointHoverBackgroundColor: 'rgb(0, 255, 255)'
- }],
- labels: ['Point 1', 'Point 2', 'Point 3']
- }
- });
- });
- it('should return items at the same x value when intersect is false', function() {
- var chart = this.chart;
- var meta0 = chart.getDatasetMeta(0);
- var meta1 = chart.getDatasetMeta(1);
- // Halfway between 2 mid points
- var pt = {
- x: meta0.data[1]._view.x,
- y: meta0.data[1]._view.y
- };
- var evt = {
- type: 'click',
- chart: chart,
- native: true, // needed otherwise things its a DOM event
- x: pt.x,
- y: 0
- };
- var elements = Chart.Interaction.modes.x(chart, evt, {intersect: false});
- expect(elements).toEqual([meta0.data[1], meta1.data[1]]);
- evt = {
- type: 'click',
- chart: chart,
- native: true, // needed otherwise things its a DOM event
- x: pt.x + 20,
- y: 0
- };
- elements = Chart.Interaction.modes.x(chart, evt, {intersect: false});
- expect(elements).toEqual([]);
- });
- it('should return items at the same x value when intersect is true', function() {
- var chart = this.chart;
- var meta0 = chart.getDatasetMeta(0);
- var meta1 = chart.getDatasetMeta(1);
- // Halfway between 2 mid points
- var pt = {
- x: meta0.data[1]._view.x,
- y: meta0.data[1]._view.y
- };
- var evt = {
- type: 'click',
- chart: chart,
- native: true, // needed otherwise things its a DOM event
- x: pt.x,
- y: 0
- };
- var elements = Chart.Interaction.modes.x(chart, evt, {intersect: true});
- expect(elements).toEqual([]); // we don't intersect anything
- evt = {
- type: 'click',
- chart: chart,
- native: true, // needed otherwise things its a DOM event
- x: pt.x,
- y: pt.y
- };
- elements = Chart.Interaction.modes.x(chart, evt, {intersect: true});
- expect(elements).toEqual([meta0.data[1], meta1.data[1]]);
- });
- });
- describe('y mode', function() {
- beforeEach(function() {
- this.chart = window.acquireChart({
- type: 'line',
- data: {
- datasets: [{
- label: 'Dataset 1',
- data: [10, 40, 30],
- pointRadius: [5, 10, 5],
- pointHoverBorderColor: 'rgb(255, 0, 0)',
- pointHoverBackgroundColor: 'rgb(0, 255, 0)'
- }, {
- label: 'Dataset 2',
- data: [40, 40, 40],
- pointRadius: [10, 10, 10],
- pointHoverBorderColor: 'rgb(0, 0, 255)',
- pointHoverBackgroundColor: 'rgb(0, 255, 255)'
- }],
- labels: ['Point 1', 'Point 2', 'Point 3']
- }
- });
- });
- it('should return items at the same y value when intersect is false', function() {
- var chart = this.chart;
- var meta0 = chart.getDatasetMeta(0);
- var meta1 = chart.getDatasetMeta(1);
- // Halfway between 2 mid points
- var pt = {
- x: meta0.data[1]._view.x,
- y: meta0.data[1]._view.y
- };
- var evt = {
- type: 'click',
- chart: chart,
- native: true,
- x: 0,
- y: pt.y,
- };
- var elements = Chart.Interaction.modes.y(chart, evt, {intersect: false});
- expect(elements).toEqual([meta0.data[1], meta1.data[0], meta1.data[1], meta1.data[2]]);
- evt = {
- type: 'click',
- chart: chart,
- native: true,
- x: pt.x,
- y: pt.y + 20, // out of range
- };
- elements = Chart.Interaction.modes.y(chart, evt, {intersect: false});
- expect(elements).toEqual([]);
- });
- it('should return items at the same y value when intersect is true', function() {
- var chart = this.chart;
- var meta0 = chart.getDatasetMeta(0);
- var meta1 = chart.getDatasetMeta(1);
- // Halfway between 2 mid points
- var pt = {
- x: meta0.data[1]._view.x,
- y: meta0.data[1]._view.y
- };
- var evt = {
- type: 'click',
- chart: chart,
- native: true,
- x: 0,
- y: pt.y
- };
- var elements = Chart.Interaction.modes.y(chart, evt, {intersect: true});
- expect(elements).toEqual([]); // we don't intersect anything
- evt = {
- type: 'click',
- chart: chart,
- native: true,
- x: pt.x,
- y: pt.y,
- };
- elements = Chart.Interaction.modes.y(chart, evt, {intersect: true});
- expect(elements).toEqual([meta0.data[1], meta1.data[0], meta1.data[1], meta1.data[2]]);
- });
- });
- });
|