controller.line.tests.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787
  1. describe('Chart.controllers.line', function() {
  2. it('should be constructed', function() {
  3. var chart = window.acquireChart({
  4. type: 'line',
  5. data: {
  6. datasets: [{
  7. data: []
  8. }],
  9. labels: []
  10. }
  11. });
  12. var meta = chart.getDatasetMeta(0);
  13. expect(meta.type).toBe('line');
  14. expect(meta.controller).not.toBe(undefined);
  15. expect(meta.controller.index).toBe(0);
  16. expect(meta.data).toEqual([]);
  17. meta.controller.updateIndex(1);
  18. expect(meta.controller.index).toBe(1);
  19. });
  20. it('Should use the first scale IDs if the dataset does not specify them', function() {
  21. var chart = window.acquireChart({
  22. type: 'line',
  23. data: {
  24. datasets: [{
  25. data: []
  26. }],
  27. labels: []
  28. },
  29. options: {
  30. scales: {
  31. xAxes: [{
  32. id: 'firstXScaleID'
  33. }],
  34. yAxes: [{
  35. id: 'firstYScaleID'
  36. }]
  37. }
  38. }
  39. });
  40. var meta = chart.getDatasetMeta(0);
  41. expect(meta.xAxisID).toBe('firstXScaleID');
  42. expect(meta.yAxisID).toBe('firstYScaleID');
  43. });
  44. it('Should create line elements and point elements for each data item during initialization', function() {
  45. var chart = window.acquireChart({
  46. type: 'line',
  47. data: {
  48. datasets: [{
  49. data: [10, 15, 0, -4],
  50. label: 'dataset1'
  51. }],
  52. labels: ['label1', 'label2', 'label3', 'label4']
  53. }
  54. });
  55. var meta = chart.getDatasetMeta(0);
  56. expect(meta.data.length).toBe(4); // 4 points created
  57. expect(meta.data[0] instanceof Chart.elements.Point).toBe(true);
  58. expect(meta.data[1] instanceof Chart.elements.Point).toBe(true);
  59. expect(meta.data[2] instanceof Chart.elements.Point).toBe(true);
  60. expect(meta.data[3] instanceof Chart.elements.Point).toBe(true);
  61. expect(meta.dataset instanceof Chart.elements.Line).toBe(true); // 1 line element
  62. });
  63. it('should draw all elements', function() {
  64. var chart = window.acquireChart({
  65. type: 'line',
  66. data: {
  67. datasets: [{
  68. data: [10, 15, 0, -4],
  69. label: 'dataset1'
  70. }],
  71. labels: ['label1', 'label2', 'label3', 'label4']
  72. },
  73. options: {
  74. showLines: true
  75. }
  76. });
  77. var meta = chart.getDatasetMeta(0);
  78. spyOn(meta.dataset, 'draw');
  79. spyOn(meta.data[0], 'draw');
  80. spyOn(meta.data[1], 'draw');
  81. spyOn(meta.data[2], 'draw');
  82. spyOn(meta.data[3], 'draw');
  83. chart.update();
  84. expect(meta.data[0].draw.calls.count()).toBe(1);
  85. expect(meta.data[1].draw.calls.count()).toBe(1);
  86. expect(meta.data[2].draw.calls.count()).toBe(1);
  87. expect(meta.data[3].draw.calls.count()).toBe(1);
  88. });
  89. it('should draw all elements except lines', function() {
  90. var chart = window.acquireChart({
  91. type: 'line',
  92. data: {
  93. datasets: [{
  94. data: [10, 15, 0, -4],
  95. label: 'dataset1'
  96. }],
  97. labels: ['label1', 'label2', 'label3', 'label4']
  98. },
  99. options: {
  100. showLines: false
  101. }
  102. });
  103. var meta = chart.getDatasetMeta(0);
  104. spyOn(meta.dataset, 'draw');
  105. spyOn(meta.data[0], 'draw');
  106. spyOn(meta.data[1], 'draw');
  107. spyOn(meta.data[2], 'draw');
  108. spyOn(meta.data[3], 'draw');
  109. chart.update();
  110. expect(meta.dataset.draw.calls.count()).toBe(0);
  111. expect(meta.data[0].draw.calls.count()).toBe(1);
  112. expect(meta.data[1].draw.calls.count()).toBe(1);
  113. expect(meta.data[2].draw.calls.count()).toBe(1);
  114. expect(meta.data[3].draw.calls.count()).toBe(1);
  115. });
  116. it('should draw all elements except lines turned off per dataset', function() {
  117. var chart = window.acquireChart({
  118. type: 'line',
  119. data: {
  120. datasets: [{
  121. data: [10, 15, 0, -4],
  122. label: 'dataset1',
  123. showLine: false
  124. }],
  125. labels: ['label1', 'label2', 'label3', 'label4']
  126. },
  127. options: {
  128. showLines: true
  129. }
  130. });
  131. var meta = chart.getDatasetMeta(0);
  132. spyOn(meta.dataset, 'draw');
  133. spyOn(meta.data[0], 'draw');
  134. spyOn(meta.data[1], 'draw');
  135. spyOn(meta.data[2], 'draw');
  136. spyOn(meta.data[3], 'draw');
  137. chart.update();
  138. expect(meta.dataset.draw.calls.count()).toBe(0);
  139. expect(meta.data[0].draw.calls.count()).toBe(1);
  140. expect(meta.data[1].draw.calls.count()).toBe(1);
  141. expect(meta.data[2].draw.calls.count()).toBe(1);
  142. expect(meta.data[3].draw.calls.count()).toBe(1);
  143. });
  144. it('should update elements when modifying data', function() {
  145. var chart = window.acquireChart({
  146. type: 'line',
  147. data: {
  148. datasets: [{
  149. data: [10, 15, 0, -4],
  150. label: 'dataset',
  151. xAxisID: 'firstXScaleID',
  152. yAxisID: 'firstYScaleID'
  153. }],
  154. labels: ['label1', 'label2', 'label3', 'label4']
  155. },
  156. options: {
  157. showLines: true,
  158. legend: false,
  159. title: false,
  160. elements: {
  161. point: {
  162. backgroundColor: 'red',
  163. borderColor: 'blue',
  164. }
  165. },
  166. scales: {
  167. xAxes: [{
  168. id: 'firstXScaleID',
  169. display: false
  170. }],
  171. yAxes: [{
  172. id: 'firstYScaleID',
  173. display: false
  174. }]
  175. }
  176. },
  177. });
  178. var meta = chart.getDatasetMeta(0);
  179. expect(meta.data.length).toBe(4);
  180. chart.data.datasets[0].data = [1, 2]; // remove 2 items
  181. chart.data.datasets[0].borderWidth = 1;
  182. chart.update();
  183. expect(meta.data.length).toBe(2);
  184. [
  185. {x: 0, y: 512},
  186. {x: 171, y: 0}
  187. ].forEach(function(expected, i) {
  188. expect(meta.data[i]._datasetIndex).toBe(0);
  189. expect(meta.data[i]._index).toBe(i);
  190. expect(meta.data[i]._xScale).toBe(chart.scales.firstXScaleID);
  191. expect(meta.data[i]._yScale).toBe(chart.scales.firstYScaleID);
  192. expect(meta.data[i]._model.x).toBeCloseToPixel(expected.x);
  193. expect(meta.data[i]._model.y).toBeCloseToPixel(expected.y);
  194. expect(meta.data[i]._model).toEqual(jasmine.objectContaining({
  195. backgroundColor: 'red',
  196. borderColor: 'blue',
  197. }));
  198. });
  199. chart.data.datasets[0].data = [1, 2, 3]; // add 1 items
  200. chart.update();
  201. expect(meta.data.length).toBe(3); // should add a new meta data item
  202. });
  203. it('should correctly calculate x scale for label and point', function() {
  204. var chart = window.acquireChart({
  205. type: 'line',
  206. data: {
  207. labels: ['One'],
  208. datasets: [{
  209. data: [1],
  210. }]
  211. },
  212. options: {
  213. legend: false,
  214. title: false,
  215. hover: {
  216. mode: 'single'
  217. },
  218. scales: {
  219. xAxes: [{
  220. display: false,
  221. }],
  222. yAxes: [{
  223. display: false,
  224. ticks: {
  225. beginAtZero: true
  226. }
  227. }]
  228. }
  229. }
  230. });
  231. var meta = chart.getDatasetMeta(0);
  232. // 1 point
  233. var point = meta.data[0];
  234. expect(point._model.x).toBeCloseToPixel(0);
  235. // 2 points
  236. chart.data.labels = ['One', 'Two'];
  237. chart.data.datasets[0].data = [1, 2];
  238. chart.update();
  239. var points = meta.data;
  240. expect(points[0]._model.x).toBeCloseToPixel(0);
  241. expect(points[1]._model.x).toBeCloseToPixel(512);
  242. // 3 points
  243. chart.data.labels = ['One', 'Two', 'Three'];
  244. chart.data.datasets[0].data = [1, 2, 3];
  245. chart.update();
  246. points = meta.data;
  247. expect(points[0]._model.x).toBeCloseToPixel(0);
  248. expect(points[1]._model.x).toBeCloseToPixel(256);
  249. expect(points[2]._model.x).toBeCloseToPixel(512);
  250. // 4 points
  251. chart.data.labels = ['One', 'Two', 'Three', 'Four'];
  252. chart.data.datasets[0].data = [1, 2, 3, 4];
  253. chart.update();
  254. points = meta.data;
  255. expect(points[0]._model.x).toBeCloseToPixel(0);
  256. expect(points[1]._model.x).toBeCloseToPixel(171);
  257. expect(points[2]._model.x).toBeCloseToPixel(340);
  258. expect(points[3]._model.x).toBeCloseToPixel(512);
  259. });
  260. it('should update elements when the y scale is stacked', function() {
  261. var chart = window.acquireChart({
  262. type: 'line',
  263. data: {
  264. datasets: [{
  265. data: [10, -10, 10, -10],
  266. label: 'dataset1'
  267. }, {
  268. data: [10, 15, 0, -4],
  269. label: 'dataset2'
  270. }],
  271. labels: ['label1', 'label2', 'label3', 'label4']
  272. },
  273. options: {
  274. legend: false,
  275. title: false,
  276. scales: {
  277. xAxes: [{
  278. display: false,
  279. }],
  280. yAxes: [{
  281. display: false,
  282. stacked: true
  283. }]
  284. }
  285. }
  286. });
  287. var meta0 = chart.getDatasetMeta(0);
  288. [
  289. {x: 0, y: 146},
  290. {x: 171, y: 439},
  291. {x: 341, y: 146},
  292. {x: 512, y: 439}
  293. ].forEach(function(values, i) {
  294. expect(meta0.data[i]._model.x).toBeCloseToPixel(values.x);
  295. expect(meta0.data[i]._model.y).toBeCloseToPixel(values.y);
  296. });
  297. var meta1 = chart.getDatasetMeta(1);
  298. [
  299. {x: 0, y: 0},
  300. {x: 171, y: 73},
  301. {x: 341, y: 146},
  302. {x: 512, y: 497}
  303. ].forEach(function(values, i) {
  304. expect(meta1.data[i]._model.x).toBeCloseToPixel(values.x);
  305. expect(meta1.data[i]._model.y).toBeCloseToPixel(values.y);
  306. });
  307. });
  308. it('should update elements when the y scale is stacked with multiple axes', function() {
  309. var chart = window.acquireChart({
  310. type: 'line',
  311. data: {
  312. datasets: [{
  313. data: [10, -10, 10, -10],
  314. label: 'dataset1'
  315. }, {
  316. data: [10, 15, 0, -4],
  317. label: 'dataset2'
  318. }, {
  319. data: [10, 10, -10, -10],
  320. label: 'dataset3',
  321. yAxisID: 'secondAxis'
  322. }],
  323. labels: ['label1', 'label2', 'label3', 'label4']
  324. },
  325. options: {
  326. legend: false,
  327. title: false,
  328. scales: {
  329. xAxes: [{
  330. display: false,
  331. }],
  332. yAxes: [{
  333. display: false,
  334. stacked: true
  335. }, {
  336. id: 'secondAxis',
  337. type: 'linear',
  338. display: false
  339. }]
  340. }
  341. }
  342. });
  343. var meta0 = chart.getDatasetMeta(0);
  344. [
  345. {x: 0, y: 146},
  346. {x: 171, y: 439},
  347. {x: 341, y: 146},
  348. {x: 512, y: 439}
  349. ].forEach(function(values, i) {
  350. expect(meta0.data[i]._model.x).toBeCloseToPixel(values.x);
  351. expect(meta0.data[i]._model.y).toBeCloseToPixel(values.y);
  352. });
  353. var meta1 = chart.getDatasetMeta(1);
  354. [
  355. {x: 0, y: 0},
  356. {x: 171, y: 73},
  357. {x: 341, y: 146},
  358. {x: 512, y: 497}
  359. ].forEach(function(values, i) {
  360. expect(meta1.data[i]._model.x).toBeCloseToPixel(values.x);
  361. expect(meta1.data[i]._model.y).toBeCloseToPixel(values.y);
  362. });
  363. });
  364. it('should update elements when the y scale is stacked and datasets is scatter data', function() {
  365. var chart = window.acquireChart({
  366. type: 'line',
  367. data: {
  368. datasets: [{
  369. data: [{
  370. x: 0,
  371. y: 10
  372. }, {
  373. x: 1,
  374. y: -10
  375. }, {
  376. x: 2,
  377. y: 10
  378. }, {
  379. x: 3,
  380. y: -10
  381. }],
  382. label: 'dataset1'
  383. }, {
  384. data: [{
  385. x: 0,
  386. y: 10
  387. }, {
  388. x: 1,
  389. y: 15
  390. }, {
  391. x: 2,
  392. y: 0
  393. }, {
  394. x: 3,
  395. y: -4
  396. }],
  397. label: 'dataset2'
  398. }],
  399. labels: ['label1', 'label2', 'label3', 'label4']
  400. },
  401. options: {
  402. legend: false,
  403. title: false,
  404. scales: {
  405. xAxes: [{
  406. display: false,
  407. }],
  408. yAxes: [{
  409. display: false,
  410. stacked: true
  411. }]
  412. }
  413. }
  414. });
  415. var meta0 = chart.getDatasetMeta(0);
  416. [
  417. {x: 0, y: 146},
  418. {x: 171, y: 439},
  419. {x: 341, y: 146},
  420. {x: 512, y: 439}
  421. ].forEach(function(values, i) {
  422. expect(meta0.data[i]._model.x).toBeCloseToPixel(values.x);
  423. expect(meta0.data[i]._model.y).toBeCloseToPixel(values.y);
  424. });
  425. var meta1 = chart.getDatasetMeta(1);
  426. [
  427. {x: 0, y: 0},
  428. {x: 171, y: 73},
  429. {x: 341, y: 146},
  430. {x: 512, y: 497}
  431. ].forEach(function(values, i) {
  432. expect(meta1.data[i]._model.x).toBeCloseToPixel(values.x);
  433. expect(meta1.data[i]._model.y).toBeCloseToPixel(values.y);
  434. });
  435. });
  436. it('should update elements when the y scale is stacked and data is strings', function() {
  437. var chart = window.acquireChart({
  438. type: 'line',
  439. data: {
  440. datasets: [{
  441. data: ['10', '-10', '10', '-10'],
  442. label: 'dataset1'
  443. }, {
  444. data: ['10', '15', '0', '-4'],
  445. label: 'dataset2'
  446. }],
  447. labels: ['label1', 'label2', 'label3', 'label4']
  448. },
  449. options: {
  450. legend: false,
  451. title: false,
  452. scales: {
  453. xAxes: [{
  454. display: false,
  455. }],
  456. yAxes: [{
  457. display: false,
  458. stacked: true
  459. }]
  460. }
  461. }
  462. });
  463. var meta0 = chart.getDatasetMeta(0);
  464. [
  465. {x: 0, y: 146},
  466. {x: 171, y: 439},
  467. {x: 341, y: 146},
  468. {x: 512, y: 439}
  469. ].forEach(function(values, i) {
  470. expect(meta0.data[i]._model.x).toBeCloseToPixel(values.x);
  471. expect(meta0.data[i]._model.y).toBeCloseToPixel(values.y);
  472. });
  473. var meta1 = chart.getDatasetMeta(1);
  474. [
  475. {x: 0, y: 0},
  476. {x: 171, y: 73},
  477. {x: 341, y: 146},
  478. {x: 512, y: 497}
  479. ].forEach(function(values, i) {
  480. expect(meta1.data[i]._model.x).toBeCloseToPixel(values.x);
  481. expect(meta1.data[i]._model.y).toBeCloseToPixel(values.y);
  482. });
  483. });
  484. it('should fall back to the line styles for points', function() {
  485. var chart = window.acquireChart({
  486. type: 'line',
  487. data: {
  488. datasets: [{
  489. data: [0, 0],
  490. label: 'dataset1',
  491. // line styles
  492. backgroundColor: 'rgb(98, 98, 98)',
  493. borderColor: 'rgb(8, 8, 8)',
  494. borderWidth: 0.55,
  495. }],
  496. labels: ['label1', 'label2']
  497. }
  498. });
  499. var meta = chart.getDatasetMeta(0);
  500. expect(meta.dataset._model.backgroundColor).toBe('rgb(98, 98, 98)');
  501. expect(meta.dataset._model.borderColor).toBe('rgb(8, 8, 8)');
  502. expect(meta.dataset._model.borderWidth).toBe(0.55);
  503. });
  504. it('should handle number of data point changes in update', function() {
  505. var chart = window.acquireChart({
  506. type: 'line',
  507. data: {
  508. datasets: [{
  509. data: [10, 15, 0, -4],
  510. label: 'dataset1',
  511. }],
  512. labels: ['label1', 'label2', 'label3', 'label4']
  513. }
  514. });
  515. var meta = chart.getDatasetMeta(0);
  516. chart.data.datasets[0].data = [1, 2]; // remove 2 items
  517. chart.update();
  518. expect(meta.data.length).toBe(2);
  519. expect(meta.data[0] instanceof Chart.elements.Point).toBe(true);
  520. expect(meta.data[1] instanceof Chart.elements.Point).toBe(true);
  521. chart.data.datasets[0].data = [1, 2, 3, 4, 5]; // add 3 items
  522. chart.update();
  523. expect(meta.data.length).toBe(5);
  524. expect(meta.data[0] instanceof Chart.elements.Point).toBe(true);
  525. expect(meta.data[1] instanceof Chart.elements.Point).toBe(true);
  526. expect(meta.data[2] instanceof Chart.elements.Point).toBe(true);
  527. expect(meta.data[3] instanceof Chart.elements.Point).toBe(true);
  528. expect(meta.data[4] instanceof Chart.elements.Point).toBe(true);
  529. });
  530. it('should set point hover styles', function() {
  531. var chart = window.acquireChart({
  532. type: 'line',
  533. data: {
  534. datasets: [{
  535. data: [10, 15, 0, -4],
  536. label: 'dataset1',
  537. }],
  538. labels: ['label1', 'label2', 'label3', 'label4']
  539. },
  540. options: {
  541. elements: {
  542. point: {
  543. backgroundColor: 'rgb(255, 255, 0)',
  544. borderWidth: 1,
  545. borderColor: 'rgb(255, 255, 255)',
  546. hitRadius: 1,
  547. hoverRadius: 4,
  548. hoverBorderWidth: 1,
  549. radius: 3,
  550. }
  551. }
  552. }
  553. });
  554. var meta = chart.getDatasetMeta(0);
  555. var point = meta.data[0];
  556. meta.controller.setHoverStyle(point);
  557. expect(point._model.backgroundColor).toBe('rgb(229, 230, 0)');
  558. expect(point._model.borderColor).toBe('rgb(230, 230, 230)');
  559. expect(point._model.borderWidth).toBe(1);
  560. expect(point._model.radius).toBe(4);
  561. // Can set hover style per dataset
  562. chart.data.datasets[0].pointHoverRadius = 3.3;
  563. chart.data.datasets[0].pointHoverBackgroundColor = 'rgb(77, 79, 81)';
  564. chart.data.datasets[0].pointHoverBorderColor = 'rgb(123, 125, 127)';
  565. chart.data.datasets[0].pointHoverBorderWidth = 2.1;
  566. meta.controller.setHoverStyle(point);
  567. expect(point._model.backgroundColor).toBe('rgb(77, 79, 81)');
  568. expect(point._model.borderColor).toBe('rgb(123, 125, 127)');
  569. expect(point._model.borderWidth).toBe(2.1);
  570. expect(point._model.radius).toBe(3.3);
  571. // Use the consistent name "pointRadius", setting but overwriting
  572. // another value in "radius"
  573. chart.data.datasets[0].pointRadius = 250;
  574. chart.data.datasets[0].radius = 20;
  575. meta.controller.setHoverStyle(point);
  576. expect(point._model.backgroundColor).toBe('rgb(77, 79, 81)');
  577. expect(point._model.borderColor).toBe('rgb(123, 125, 127)');
  578. expect(point._model.borderWidth).toBe(2.1);
  579. expect(point._model.radius).toBe(3.3);
  580. // Custom style
  581. point.custom = {
  582. hoverRadius: 4.4,
  583. hoverBorderWidth: 5.5,
  584. hoverBackgroundColor: 'rgb(0, 0, 0)',
  585. hoverBorderColor: 'rgb(10, 10, 10)'
  586. };
  587. meta.controller.setHoverStyle(point);
  588. expect(point._model.backgroundColor).toBe('rgb(0, 0, 0)');
  589. expect(point._model.borderColor).toBe('rgb(10, 10, 10)');
  590. expect(point._model.borderWidth).toBe(5.5);
  591. expect(point._model.radius).toBe(4.4);
  592. });
  593. it('should remove hover styles', function() {
  594. var chart = window.acquireChart({
  595. type: 'line',
  596. data: {
  597. datasets: [{
  598. data: [10, 15, 0, -4],
  599. label: 'dataset1',
  600. }],
  601. labels: ['label1', 'label2', 'label3', 'label4']
  602. },
  603. options: {
  604. elements: {
  605. point: {
  606. backgroundColor: 'rgb(255, 255, 0)',
  607. borderWidth: 1,
  608. borderColor: 'rgb(255, 255, 255)',
  609. hitRadius: 1,
  610. hoverRadius: 4,
  611. hoverBorderWidth: 1,
  612. radius: 3,
  613. }
  614. }
  615. }
  616. });
  617. var meta = chart.getDatasetMeta(0);
  618. var point = meta.data[0];
  619. chart.options.elements.point.backgroundColor = 'rgb(45, 46, 47)';
  620. chart.options.elements.point.borderColor = 'rgb(50, 51, 52)';
  621. chart.options.elements.point.borderWidth = 10.1;
  622. chart.options.elements.point.radius = 1.01;
  623. meta.controller.removeHoverStyle(point);
  624. expect(point._model.backgroundColor).toBe('rgb(45, 46, 47)');
  625. expect(point._model.borderColor).toBe('rgb(50, 51, 52)');
  626. expect(point._model.borderWidth).toBe(10.1);
  627. expect(point._model.radius).toBe(1.01);
  628. // Can set hover style per dataset
  629. chart.data.datasets[0].radius = 3.3;
  630. chart.data.datasets[0].pointBackgroundColor = 'rgb(77, 79, 81)';
  631. chart.data.datasets[0].pointBorderColor = 'rgb(123, 125, 127)';
  632. chart.data.datasets[0].pointBorderWidth = 2.1;
  633. meta.controller.removeHoverStyle(point);
  634. expect(point._model.backgroundColor).toBe('rgb(77, 79, 81)');
  635. expect(point._model.borderColor).toBe('rgb(123, 125, 127)');
  636. expect(point._model.borderWidth).toBe(2.1);
  637. expect(point._model.radius).toBe(3.3);
  638. // Use the consistent name "pointRadius", setting but overwriting
  639. // another value in "radius"
  640. chart.data.datasets[0].pointRadius = 250;
  641. chart.data.datasets[0].radius = 20;
  642. meta.controller.removeHoverStyle(point);
  643. expect(point._model.backgroundColor).toBe('rgb(77, 79, 81)');
  644. expect(point._model.borderColor).toBe('rgb(123, 125, 127)');
  645. expect(point._model.borderWidth).toBe(2.1);
  646. expect(point._model.radius).toBe(250);
  647. // Custom style
  648. point.custom = {
  649. radius: 4.4,
  650. borderWidth: 5.5,
  651. backgroundColor: 'rgb(0, 0, 0)',
  652. borderColor: 'rgb(10, 10, 10)'
  653. };
  654. meta.controller.removeHoverStyle(point);
  655. expect(point._model.backgroundColor).toBe('rgb(0, 0, 0)');
  656. expect(point._model.borderColor).toBe('rgb(10, 10, 10)');
  657. expect(point._model.borderWidth).toBe(5.5);
  658. expect(point._model.radius).toBe(4.4);
  659. });
  660. it('should allow 0 as a point border width', function() {
  661. var chart = window.acquireChart({
  662. type: 'line',
  663. data: {
  664. datasets: [{
  665. data: [10, 15, 0, -4],
  666. label: 'dataset1',
  667. pointBorderWidth: 0
  668. }],
  669. labels: ['label1', 'label2', 'label3', 'label4']
  670. }
  671. });
  672. var meta = chart.getDatasetMeta(0);
  673. var point = meta.data[0];
  674. expect(point._model.borderWidth).toBe(0);
  675. });
  676. it('should allow an array as the point border width setting', function() {
  677. var chart = window.acquireChart({
  678. type: 'line',
  679. data: {
  680. datasets: [{
  681. data: [10, 15, 0, -4],
  682. label: 'dataset1',
  683. pointBorderWidth: [1, 2, 3, 4]
  684. }],
  685. labels: ['label1', 'label2', 'label3', 'label4']
  686. }
  687. });
  688. var meta = chart.getDatasetMeta(0);
  689. expect(meta.data[0]._model.borderWidth).toBe(1);
  690. expect(meta.data[1]._model.borderWidth).toBe(2);
  691. expect(meta.data[2]._model.borderWidth).toBe(3);
  692. expect(meta.data[3]._model.borderWidth).toBe(4);
  693. });
  694. });