core.interaction.tests.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788
  1. // Tests of the interaction handlers in Core.Interaction
  2. // Test the rectangle element
  3. describe('Core.Interaction', function() {
  4. describe('point mode', function() {
  5. beforeEach(function() {
  6. this.chart = window.acquireChart({
  7. type: 'line',
  8. data: {
  9. datasets: [{
  10. label: 'Dataset 1',
  11. data: [10, 20, 30],
  12. pointHoverBorderColor: 'rgb(255, 0, 0)',
  13. pointHoverBackgroundColor: 'rgb(0, 255, 0)'
  14. }, {
  15. label: 'Dataset 2',
  16. data: [40, 20, 40],
  17. pointHoverBorderColor: 'rgb(0, 0, 255)',
  18. pointHoverBackgroundColor: 'rgb(0, 255, 255)'
  19. }],
  20. labels: ['Point 1', 'Point 2', 'Point 3']
  21. }
  22. });
  23. });
  24. it ('should return all items under the point', function() {
  25. var chart = this.chart;
  26. var meta0 = chart.getDatasetMeta(0);
  27. var meta1 = chart.getDatasetMeta(1);
  28. var point = meta0.data[1];
  29. var evt = {
  30. type: 'click',
  31. chart: chart,
  32. native: true, // needed otherwise things its a DOM event
  33. x: point._model.x,
  34. y: point._model.y,
  35. };
  36. var elements = Chart.Interaction.modes.point(chart, evt);
  37. expect(elements).toEqual([point, meta1.data[1]]);
  38. });
  39. it ('should return an empty array when no items are found', function() {
  40. var chart = this.chart;
  41. var evt = {
  42. type: 'click',
  43. chart: chart,
  44. native: true, // needed otherwise things its a DOM event
  45. x: 0,
  46. y: 0
  47. };
  48. var elements = Chart.Interaction.modes.point(chart, evt);
  49. expect(elements).toEqual([]);
  50. });
  51. });
  52. describe('index mode', function() {
  53. describe('intersect: true', function() {
  54. beforeEach(function() {
  55. this.chart = window.acquireChart({
  56. type: 'line',
  57. data: {
  58. datasets: [{
  59. label: 'Dataset 1',
  60. data: [10, 20, 30],
  61. pointHoverBorderColor: 'rgb(255, 0, 0)',
  62. pointHoverBackgroundColor: 'rgb(0, 255, 0)'
  63. }, {
  64. label: 'Dataset 2',
  65. data: [40, 40, 40],
  66. pointHoverBorderColor: 'rgb(0, 0, 255)',
  67. pointHoverBackgroundColor: 'rgb(0, 255, 255)'
  68. }],
  69. labels: ['Point 1', 'Point 2', 'Point 3']
  70. }
  71. });
  72. });
  73. it ('gets correct items', function() {
  74. var chart = this.chart;
  75. var meta0 = chart.getDatasetMeta(0);
  76. var meta1 = chart.getDatasetMeta(1);
  77. var point = meta0.data[1];
  78. var evt = {
  79. type: 'click',
  80. chart: chart,
  81. native: true, // needed otherwise things its a DOM event
  82. x: point._model.x,
  83. y: point._model.y,
  84. };
  85. var elements = Chart.Interaction.modes.index(chart, evt, {intersect: true});
  86. expect(elements).toEqual([point, meta1.data[1]]);
  87. });
  88. it ('returns empty array when nothing found', function() {
  89. var chart = this.chart;
  90. var evt = {
  91. type: 'click',
  92. chart: chart,
  93. native: true, // needed otherwise things its a DOM event
  94. x: 0,
  95. y: 0,
  96. };
  97. var elements = Chart.Interaction.modes.index(chart, evt, {intersect: true});
  98. expect(elements).toEqual([]);
  99. });
  100. });
  101. describe ('intersect: false', function() {
  102. var data = {
  103. datasets: [{
  104. label: 'Dataset 1',
  105. data: [10, 20, 30],
  106. pointHoverBorderColor: 'rgb(255, 0, 0)',
  107. pointHoverBackgroundColor: 'rgb(0, 255, 0)'
  108. }, {
  109. label: 'Dataset 2',
  110. data: [40, 40, 40],
  111. pointHoverBorderColor: 'rgb(0, 0, 255)',
  112. pointHoverBackgroundColor: 'rgb(0, 255, 255)'
  113. }],
  114. labels: ['Point 1', 'Point 2', 'Point 3']
  115. };
  116. beforeEach(function() {
  117. this.chart = window.acquireChart({
  118. type: 'line',
  119. data: data
  120. });
  121. });
  122. it ('axis: x gets correct items', function() {
  123. var chart = this.chart;
  124. var meta0 = chart.getDatasetMeta(0);
  125. var meta1 = chart.getDatasetMeta(1);
  126. var evt = {
  127. type: 'click',
  128. chart: chart,
  129. native: true, // needed otherwise things its a DOM event
  130. x: 0,
  131. y: 0
  132. };
  133. var elements = Chart.Interaction.modes.index(chart, evt, {intersect: false});
  134. expect(elements).toEqual([meta0.data[0], meta1.data[0]]);
  135. });
  136. it ('axis: y gets correct items', function() {
  137. var chart = window.acquireChart({
  138. type: 'horizontalBar',
  139. data: data
  140. });
  141. var meta0 = chart.getDatasetMeta(0);
  142. var meta1 = chart.getDatasetMeta(1);
  143. var center = meta0.data[0].getCenterPoint();
  144. var evt = {
  145. type: 'click',
  146. chart: chart,
  147. native: true, // needed otherwise things its a DOM event
  148. x: center.x,
  149. y: center.y + 30,
  150. };
  151. var elements = Chart.Interaction.modes.index(chart, evt, {axis: 'y', intersect: false});
  152. expect(elements).toEqual([meta0.data[0], meta1.data[0]]);
  153. });
  154. it ('axis: xy gets correct items', function() {
  155. var chart = this.chart;
  156. var meta0 = chart.getDatasetMeta(0);
  157. var meta1 = chart.getDatasetMeta(1);
  158. var evt = {
  159. type: 'click',
  160. chart: chart,
  161. native: true, // needed otherwise things its a DOM event
  162. x: 0,
  163. y: 0
  164. };
  165. var elements = Chart.Interaction.modes.index(chart, evt, {axis: 'xy', intersect: false});
  166. expect(elements).toEqual([meta0.data[0], meta1.data[0]]);
  167. });
  168. });
  169. });
  170. describe('dataset mode', function() {
  171. describe('intersect: true', function() {
  172. beforeEach(function() {
  173. this.chart = window.acquireChart({
  174. type: 'line',
  175. data: {
  176. datasets: [{
  177. label: 'Dataset 1',
  178. data: [10, 20, 30],
  179. pointHoverBorderColor: 'rgb(255, 0, 0)',
  180. pointHoverBackgroundColor: 'rgb(0, 255, 0)'
  181. }, {
  182. label: 'Dataset 2',
  183. data: [40, 40, 40],
  184. pointHoverBorderColor: 'rgb(0, 0, 255)',
  185. pointHoverBackgroundColor: 'rgb(0, 255, 255)'
  186. }],
  187. labels: ['Point 1', 'Point 2', 'Point 3']
  188. }
  189. });
  190. });
  191. it ('should return all items in the dataset of the first item found', function() {
  192. var chart = this.chart;
  193. var meta = chart.getDatasetMeta(0);
  194. var point = meta.data[1];
  195. var evt = {
  196. type: 'click',
  197. chart: chart,
  198. native: true, // needed otherwise things its a DOM event
  199. x: point._model.x,
  200. y: point._model.y
  201. };
  202. var elements = Chart.Interaction.modes.dataset(chart, evt, {intersect: true});
  203. expect(elements).toEqual(meta.data);
  204. });
  205. it ('should return an empty array if nothing found', function() {
  206. var chart = this.chart;
  207. var evt = {
  208. type: 'click',
  209. chart: chart,
  210. native: true, // needed otherwise things its a DOM event
  211. x: 0,
  212. y: 0
  213. };
  214. var elements = Chart.Interaction.modes.dataset(chart, evt, {intersect: true});
  215. expect(elements).toEqual([]);
  216. });
  217. });
  218. describe('intersect: false', function() {
  219. var data = {
  220. datasets: [{
  221. label: 'Dataset 1',
  222. data: [10, 20, 30],
  223. pointHoverBorderColor: 'rgb(255, 0, 0)',
  224. pointHoverBackgroundColor: 'rgb(0, 255, 0)'
  225. }, {
  226. label: 'Dataset 2',
  227. data: [40, 40, 40],
  228. pointHoverBorderColor: 'rgb(0, 0, 255)',
  229. pointHoverBackgroundColor: 'rgb(0, 255, 255)'
  230. }],
  231. labels: ['Point 1', 'Point 2', 'Point 3']
  232. };
  233. beforeEach(function() {
  234. this.chart = window.acquireChart({
  235. type: 'line',
  236. data: data
  237. });
  238. });
  239. it ('axis: x gets correct items', function() {
  240. var chart = window.acquireChart({
  241. type: 'horizontalBar',
  242. data: data
  243. });
  244. var evt = {
  245. type: 'click',
  246. chart: chart,
  247. native: true, // needed otherwise things its a DOM event
  248. x: 0,
  249. y: 0
  250. };
  251. var elements = Chart.Interaction.modes.dataset(chart, evt, {axis: 'x', intersect: false});
  252. var meta = chart.getDatasetMeta(0);
  253. expect(elements).toEqual(meta.data);
  254. });
  255. it ('axis: y gets correct items', function() {
  256. var chart = this.chart;
  257. var evt = {
  258. type: 'click',
  259. chart: chart,
  260. native: true, // needed otherwise things its a DOM event
  261. x: 0,
  262. y: 0
  263. };
  264. var elements = Chart.Interaction.modes.dataset(chart, evt, {axis: 'y', intersect: false});
  265. var meta = chart.getDatasetMeta(1);
  266. expect(elements).toEqual(meta.data);
  267. });
  268. it ('axis: xy gets correct items', function() {
  269. var chart = this.chart;
  270. var evt = {
  271. type: 'click',
  272. chart: chart,
  273. native: true, // needed otherwise things its a DOM event
  274. x: 0,
  275. y: 0
  276. };
  277. var elements = Chart.Interaction.modes.dataset(chart, evt, {intersect: false});
  278. var meta = chart.getDatasetMeta(1);
  279. expect(elements).toEqual(meta.data);
  280. });
  281. });
  282. });
  283. describe('nearest mode', function() {
  284. describe('intersect: false', function() {
  285. beforeEach(function() {
  286. this.chart = window.acquireChart({
  287. type: 'line',
  288. data: {
  289. datasets: [{
  290. label: 'Dataset 1',
  291. data: [10, 40, 30],
  292. pointRadius: [5, 5, 5],
  293. pointHoverBorderColor: 'rgb(255, 0, 0)',
  294. pointHoverBackgroundColor: 'rgb(0, 255, 0)'
  295. }, {
  296. label: 'Dataset 2',
  297. data: [40, 40, 40],
  298. pointRadius: [10, 10, 10],
  299. pointHoverBorderColor: 'rgb(0, 0, 255)',
  300. pointHoverBackgroundColor: 'rgb(0, 255, 255)'
  301. }],
  302. labels: ['Point 1', 'Point 2', 'Point 3']
  303. }
  304. });
  305. });
  306. describe('axis: xy', function() {
  307. it ('should return the nearest item', function() {
  308. var chart = this.chart;
  309. var evt = {
  310. type: 'click',
  311. chart: chart,
  312. native: true, // needed otherwise things its a DOM event
  313. x: 0,
  314. y: 0
  315. };
  316. // Nearest to 0,0 (top left) will be first point of dataset 2
  317. var elements = Chart.Interaction.modes.nearest(chart, evt, {intersect: false});
  318. var meta = chart.getDatasetMeta(1);
  319. expect(elements).toEqual([meta.data[0]]);
  320. });
  321. it ('should return all items at the same nearest distance', function() {
  322. var chart = this.chart;
  323. var meta0 = chart.getDatasetMeta(0);
  324. var meta1 = chart.getDatasetMeta(1);
  325. // Halfway between 2 mid points
  326. var pt = {
  327. x: meta0.data[1]._view.x,
  328. y: (meta0.data[1]._view.y + meta1.data[1]._view.y) / 2
  329. };
  330. var evt = {
  331. type: 'click',
  332. chart: chart,
  333. native: true, // needed otherwise things its a DOM event
  334. x: pt.x,
  335. y: pt.y
  336. };
  337. // Both points are nearest
  338. var elements = Chart.Interaction.modes.nearest(chart, evt, {intersect: false});
  339. expect(elements).toEqual([meta0.data[1], meta1.data[1]]);
  340. });
  341. });
  342. describe('axis: x', function() {
  343. it ('should return all items at current x', function() {
  344. var chart = this.chart;
  345. var meta0 = chart.getDatasetMeta(0);
  346. var meta1 = chart.getDatasetMeta(1);
  347. // At 'Point 2', 10
  348. var pt = {
  349. x: meta0.data[1]._view.x,
  350. y: meta0.data[0]._view.y
  351. };
  352. var evt = {
  353. type: 'click',
  354. chart: chart,
  355. native: true, // needed otherwise things its a DOM event
  356. x: pt.x,
  357. y: pt.y
  358. };
  359. // Middle point from both series are nearest
  360. var elements = Chart.Interaction.modes.nearest(chart, evt, {axis: 'x', intersect: false});
  361. expect(elements).toEqual([meta0.data[1], meta1.data[1]]);
  362. });
  363. it ('should return all items at nearest x-distance', function() {
  364. var chart = this.chart;
  365. var meta0 = chart.getDatasetMeta(0);
  366. var meta1 = chart.getDatasetMeta(1);
  367. // Haflway between 'Point 1' and 'Point 2', y=10
  368. var pt = {
  369. x: (meta0.data[0]._view.x + meta0.data[1]._view.x) / 2,
  370. y: meta0.data[0]._view.y
  371. };
  372. var evt = {
  373. type: 'click',
  374. chart: chart,
  375. native: true, // needed otherwise things its a DOM event
  376. x: pt.x,
  377. y: pt.y
  378. };
  379. // Should return all (4) points from 'Point 1' and 'Point 2'
  380. var elements = Chart.Interaction.modes.nearest(chart, evt, {axis: 'x', intersect: false});
  381. expect(elements).toEqual([meta0.data[0], meta0.data[1], meta1.data[0], meta1.data[1]]);
  382. });
  383. });
  384. describe('axis: y', function() {
  385. it ('should return item with value 30', function() {
  386. var chart = this.chart;
  387. var meta0 = chart.getDatasetMeta(0);
  388. // 'Point 1', y = 30
  389. var pt = {
  390. x: meta0.data[0]._view.x,
  391. y: meta0.data[2]._view.y
  392. };
  393. var evt = {
  394. type: 'click',
  395. chart: chart,
  396. native: true, // needed otherwise things its a DOM event
  397. x: pt.x,
  398. y: pt.y
  399. };
  400. // Middle point from both series are nearest
  401. var elements = Chart.Interaction.modes.nearest(chart, evt, {axis: 'y', intersect: false});
  402. expect(elements).toEqual([meta0.data[2]]);
  403. });
  404. it ('should return all items at value 40', function() {
  405. var chart = this.chart;
  406. var meta0 = chart.getDatasetMeta(0);
  407. var meta1 = chart.getDatasetMeta(1);
  408. // 'Point 1', y = 40
  409. var pt = {
  410. x: meta0.data[0]._view.x,
  411. y: meta0.data[1]._view.y
  412. };
  413. var evt = {
  414. type: 'click',
  415. chart: chart,
  416. native: true, // needed otherwise things its a DOM event
  417. x: pt.x,
  418. y: pt.y
  419. };
  420. // Should return points with value 40
  421. var elements = Chart.Interaction.modes.nearest(chart, evt, {axis: 'y', intersect: false});
  422. expect(elements).toEqual([meta0.data[1], meta1.data[0], meta1.data[1], meta1.data[2]]);
  423. });
  424. });
  425. });
  426. describe('intersect: true', function() {
  427. beforeEach(function() {
  428. this.chart = window.acquireChart({
  429. type: 'line',
  430. data: {
  431. datasets: [{
  432. label: 'Dataset 1',
  433. data: [10, 20, 30],
  434. pointHoverBorderColor: 'rgb(255, 0, 0)',
  435. pointHoverBackgroundColor: 'rgb(0, 255, 0)'
  436. }, {
  437. label: 'Dataset 2',
  438. data: [40, 40, 40],
  439. pointHoverBorderColor: 'rgb(0, 0, 255)',
  440. pointHoverBackgroundColor: 'rgb(0, 255, 255)'
  441. }],
  442. labels: ['Point 1', 'Point 2', 'Point 3']
  443. }
  444. });
  445. });
  446. describe('axis=xy', function() {
  447. it ('should return the nearest item', function() {
  448. var chart = this.chart;
  449. var meta = chart.getDatasetMeta(1);
  450. var point = meta.data[1];
  451. var evt = {
  452. type: 'click',
  453. chart: chart,
  454. native: true, // needed otherwise things its a DOM event
  455. x: point._view.x + 15,
  456. y: point._view.y
  457. };
  458. // Nothing intersects so find nothing
  459. var elements = Chart.Interaction.modes.nearest(chart, evt, {intersect: true});
  460. expect(elements).toEqual([]);
  461. evt = {
  462. type: 'click',
  463. chart: chart,
  464. native: true,
  465. x: point._view.x,
  466. y: point._view.y
  467. };
  468. elements = Chart.Interaction.modes.nearest(chart, evt, {intersect: true});
  469. expect(elements).toEqual([point]);
  470. });
  471. it ('should return the nearest item even if 2 intersect', function() {
  472. var chart = this.chart;
  473. chart.data.datasets[0].pointRadius = [5, 30, 5];
  474. chart.data.datasets[0].data[1] = 39;
  475. chart.data.datasets[1].pointRadius = [10, 10, 10];
  476. chart.update();
  477. // Trigger an event over top of the
  478. var meta0 = chart.getDatasetMeta(0);
  479. // Halfway between 2 mid points
  480. var pt = {
  481. x: meta0.data[1]._view.x,
  482. y: meta0.data[1]._view.y
  483. };
  484. var evt = {
  485. type: 'click',
  486. chart: chart,
  487. native: true, // needed otherwise things its a DOM event
  488. x: pt.x,
  489. y: pt.y
  490. };
  491. var elements = Chart.Interaction.modes.nearest(chart, evt, {intersect: true});
  492. expect(elements).toEqual([meta0.data[1]]);
  493. });
  494. it ('should return the all items if more than 1 are at the same distance', function() {
  495. var chart = this.chart;
  496. chart.data.datasets[0].pointRadius = [5, 5, 5];
  497. chart.data.datasets[0].data[1] = 40;
  498. chart.data.datasets[1].pointRadius = [10, 10, 10];
  499. chart.update();
  500. var meta0 = chart.getDatasetMeta(0);
  501. var meta1 = chart.getDatasetMeta(1);
  502. // Halfway between 2 mid points
  503. var pt = {
  504. x: meta0.data[1]._view.x,
  505. y: meta0.data[1]._view.y
  506. };
  507. var evt = {
  508. type: 'click',
  509. chart: chart,
  510. native: true, // needed otherwise things its a DOM event
  511. x: pt.x,
  512. y: pt.y
  513. };
  514. var elements = Chart.Interaction.modes.nearest(chart, evt, {intersect: true});
  515. expect(elements).toEqual([meta0.data[1], meta1.data[1]]);
  516. });
  517. });
  518. });
  519. });
  520. describe('x mode', function() {
  521. beforeEach(function() {
  522. this.chart = window.acquireChart({
  523. type: 'line',
  524. data: {
  525. datasets: [{
  526. label: 'Dataset 1',
  527. data: [10, 40, 30],
  528. pointRadius: [5, 10, 5],
  529. pointHoverBorderColor: 'rgb(255, 0, 0)',
  530. pointHoverBackgroundColor: 'rgb(0, 255, 0)'
  531. }, {
  532. label: 'Dataset 2',
  533. data: [40, 40, 40],
  534. pointRadius: [10, 10, 10],
  535. pointHoverBorderColor: 'rgb(0, 0, 255)',
  536. pointHoverBackgroundColor: 'rgb(0, 255, 255)'
  537. }],
  538. labels: ['Point 1', 'Point 2', 'Point 3']
  539. }
  540. });
  541. });
  542. it('should return items at the same x value when intersect is false', function() {
  543. var chart = this.chart;
  544. var meta0 = chart.getDatasetMeta(0);
  545. var meta1 = chart.getDatasetMeta(1);
  546. // Halfway between 2 mid points
  547. var pt = {
  548. x: meta0.data[1]._view.x,
  549. y: meta0.data[1]._view.y
  550. };
  551. var evt = {
  552. type: 'click',
  553. chart: chart,
  554. native: true, // needed otherwise things its a DOM event
  555. x: pt.x,
  556. y: 0
  557. };
  558. var elements = Chart.Interaction.modes.x(chart, evt, {intersect: false});
  559. expect(elements).toEqual([meta0.data[1], meta1.data[1]]);
  560. evt = {
  561. type: 'click',
  562. chart: chart,
  563. native: true, // needed otherwise things its a DOM event
  564. x: pt.x + 20,
  565. y: 0
  566. };
  567. elements = Chart.Interaction.modes.x(chart, evt, {intersect: false});
  568. expect(elements).toEqual([]);
  569. });
  570. it('should return items at the same x value when intersect is true', function() {
  571. var chart = this.chart;
  572. var meta0 = chart.getDatasetMeta(0);
  573. var meta1 = chart.getDatasetMeta(1);
  574. // Halfway between 2 mid points
  575. var pt = {
  576. x: meta0.data[1]._view.x,
  577. y: meta0.data[1]._view.y
  578. };
  579. var evt = {
  580. type: 'click',
  581. chart: chart,
  582. native: true, // needed otherwise things its a DOM event
  583. x: pt.x,
  584. y: 0
  585. };
  586. var elements = Chart.Interaction.modes.x(chart, evt, {intersect: true});
  587. expect(elements).toEqual([]); // we don't intersect anything
  588. evt = {
  589. type: 'click',
  590. chart: chart,
  591. native: true, // needed otherwise things its a DOM event
  592. x: pt.x,
  593. y: pt.y
  594. };
  595. elements = Chart.Interaction.modes.x(chart, evt, {intersect: true});
  596. expect(elements).toEqual([meta0.data[1], meta1.data[1]]);
  597. });
  598. });
  599. describe('y mode', function() {
  600. beforeEach(function() {
  601. this.chart = window.acquireChart({
  602. type: 'line',
  603. data: {
  604. datasets: [{
  605. label: 'Dataset 1',
  606. data: [10, 40, 30],
  607. pointRadius: [5, 10, 5],
  608. pointHoverBorderColor: 'rgb(255, 0, 0)',
  609. pointHoverBackgroundColor: 'rgb(0, 255, 0)'
  610. }, {
  611. label: 'Dataset 2',
  612. data: [40, 40, 40],
  613. pointRadius: [10, 10, 10],
  614. pointHoverBorderColor: 'rgb(0, 0, 255)',
  615. pointHoverBackgroundColor: 'rgb(0, 255, 255)'
  616. }],
  617. labels: ['Point 1', 'Point 2', 'Point 3']
  618. }
  619. });
  620. });
  621. it('should return items at the same y value when intersect is false', function() {
  622. var chart = this.chart;
  623. var meta0 = chart.getDatasetMeta(0);
  624. var meta1 = chart.getDatasetMeta(1);
  625. // Halfway between 2 mid points
  626. var pt = {
  627. x: meta0.data[1]._view.x,
  628. y: meta0.data[1]._view.y
  629. };
  630. var evt = {
  631. type: 'click',
  632. chart: chart,
  633. native: true,
  634. x: 0,
  635. y: pt.y,
  636. };
  637. var elements = Chart.Interaction.modes.y(chart, evt, {intersect: false});
  638. expect(elements).toEqual([meta0.data[1], meta1.data[0], meta1.data[1], meta1.data[2]]);
  639. evt = {
  640. type: 'click',
  641. chart: chart,
  642. native: true,
  643. x: pt.x,
  644. y: pt.y + 20, // out of range
  645. };
  646. elements = Chart.Interaction.modes.y(chart, evt, {intersect: false});
  647. expect(elements).toEqual([]);
  648. });
  649. it('should return items at the same y value when intersect is true', function() {
  650. var chart = this.chart;
  651. var meta0 = chart.getDatasetMeta(0);
  652. var meta1 = chart.getDatasetMeta(1);
  653. // Halfway between 2 mid points
  654. var pt = {
  655. x: meta0.data[1]._view.x,
  656. y: meta0.data[1]._view.y
  657. };
  658. var evt = {
  659. type: 'click',
  660. chart: chart,
  661. native: true,
  662. x: 0,
  663. y: pt.y
  664. };
  665. var elements = Chart.Interaction.modes.y(chart, evt, {intersect: true});
  666. expect(elements).toEqual([]); // we don't intersect anything
  667. evt = {
  668. type: 'click',
  669. chart: chart,
  670. native: true,
  671. x: pt.x,
  672. y: pt.y,
  673. };
  674. elements = Chart.Interaction.modes.y(chart, evt, {intersect: true});
  675. expect(elements).toEqual([meta0.data[1], meta1.data[0], meta1.data[1], meta1.data[2]]);
  676. });
  677. });
  678. });