controller.radar.tests.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. describe('Chart.controllers.radar', function() {
  2. describe('auto', jasmine.fixture.specs('controller.radar'));
  3. it('should be registered as dataset controller', function() {
  4. expect(typeof Chart.controllers.radar).toBe('function');
  5. });
  6. it('Should be constructed', function() {
  7. var chart = window.acquireChart({
  8. type: 'radar',
  9. data: {
  10. datasets: [{
  11. data: []
  12. }],
  13. labels: []
  14. }
  15. });
  16. var meta = chart.getDatasetMeta(0);
  17. expect(meta.type).toBe('radar');
  18. expect(meta.controller).not.toBe(undefined);
  19. expect(meta.controller.index).toBe(0);
  20. expect(meta.data).toEqual([]);
  21. meta.controller.updateIndex(1);
  22. expect(meta.controller.index).toBe(1);
  23. });
  24. it('Should create arc elements for each data item during initialization', function() {
  25. var chart = window.acquireChart({
  26. type: 'radar',
  27. data: {
  28. datasets: [{
  29. data: [10, 15, 0, 4]
  30. }],
  31. labels: ['label1', 'label2', 'label3', 'label4']
  32. }
  33. });
  34. var meta = chart.getDatasetMeta(0);
  35. expect(meta.dataset instanceof Chart.elements.Line).toBe(true); // line element
  36. expect(meta.data.length).toBe(4); // 4 points created
  37. expect(meta.data[0] instanceof Chart.elements.Point).toBe(true);
  38. expect(meta.data[1] instanceof Chart.elements.Point).toBe(true);
  39. expect(meta.data[2] instanceof Chart.elements.Point).toBe(true);
  40. expect(meta.data[3] instanceof Chart.elements.Point).toBe(true);
  41. });
  42. it('should draw all elements', function() {
  43. var chart = window.acquireChart({
  44. type: 'radar',
  45. data: {
  46. datasets: [{
  47. data: [10, 15, 0, 4]
  48. }],
  49. labels: ['label1', 'label2', 'label3', 'label4']
  50. }
  51. });
  52. var meta = chart.getDatasetMeta(0);
  53. spyOn(meta.dataset, 'draw');
  54. spyOn(meta.data[0], 'draw');
  55. spyOn(meta.data[1], 'draw');
  56. spyOn(meta.data[2], 'draw');
  57. spyOn(meta.data[3], 'draw');
  58. chart.update();
  59. expect(meta.dataset.draw.calls.count()).toBe(1);
  60. expect(meta.data[0].draw.calls.count()).toBe(1);
  61. expect(meta.data[1].draw.calls.count()).toBe(1);
  62. expect(meta.data[2].draw.calls.count()).toBe(1);
  63. expect(meta.data[3].draw.calls.count()).toBe(1);
  64. });
  65. it('should update elements', function() {
  66. var chart = window.acquireChart({
  67. type: 'radar',
  68. data: {
  69. datasets: [{
  70. data: [10, 15, 0, 4]
  71. }],
  72. labels: ['label1', 'label2', 'label3', 'label4']
  73. },
  74. options: {
  75. showLines: true,
  76. legend: false,
  77. title: false,
  78. elements: {
  79. line: {
  80. backgroundColor: 'rgb(255, 0, 0)',
  81. borderCapStyle: 'round',
  82. borderColor: 'rgb(0, 255, 0)',
  83. borderDash: [],
  84. borderDashOffset: 0.1,
  85. borderJoinStyle: 'bevel',
  86. borderWidth: 1.2,
  87. fill: true,
  88. tension: 0.1,
  89. },
  90. point: {
  91. backgroundColor: Chart.defaults.global.defaultColor,
  92. borderWidth: 1,
  93. borderColor: Chart.defaults.global.defaultColor,
  94. hitRadius: 1,
  95. hoverRadius: 4,
  96. hoverBorderWidth: 1,
  97. radius: 3,
  98. pointStyle: 'circle'
  99. }
  100. }
  101. }
  102. });
  103. var meta = chart.getDatasetMeta(0);
  104. meta.controller.reset(); // reset first
  105. // Line element
  106. expect(meta.dataset._model).toEqual(jasmine.objectContaining({
  107. backgroundColor: 'rgb(255, 0, 0)',
  108. borderCapStyle: 'round',
  109. borderColor: 'rgb(0, 255, 0)',
  110. borderDash: [],
  111. borderDashOffset: 0.1,
  112. borderJoinStyle: 'bevel',
  113. borderWidth: 1.2,
  114. fill: true,
  115. }));
  116. [
  117. {x: 256, y: 260, cppx: 256, cppy: 260, cpnx: 256, cpny: 260},
  118. {x: 256, y: 260, cppx: 256, cppy: 260, cpnx: 256, cpny: 260},
  119. {x: 256, y: 260, cppx: 256, cppy: 260, cpnx: 256, cpny: 260},
  120. {x: 256, y: 260, cppx: 256, cppy: 260, cpnx: 256, cpny: 260},
  121. ].forEach(function(expected, i) {
  122. expect(meta.data[i]._model.x).toBeCloseToPixel(expected.x);
  123. expect(meta.data[i]._model.y).toBeCloseToPixel(expected.y);
  124. expect(meta.data[i]._model.controlPointPreviousX).toBeCloseToPixel(expected.cppx);
  125. expect(meta.data[i]._model.controlPointPreviousY).toBeCloseToPixel(expected.cppy);
  126. expect(meta.data[i]._model.controlPointNextX).toBeCloseToPixel(expected.cpnx);
  127. expect(meta.data[i]._model.controlPointNextY).toBeCloseToPixel(expected.cpny);
  128. expect(meta.data[i]._model).toEqual(jasmine.objectContaining({
  129. backgroundColor: Chart.defaults.global.defaultColor,
  130. borderWidth: 1,
  131. borderColor: Chart.defaults.global.defaultColor,
  132. hitRadius: 1,
  133. radius: 3,
  134. pointStyle: 'circle',
  135. skip: false,
  136. tension: 0.1,
  137. }));
  138. });
  139. // Now update controller and ensure proper updates
  140. meta.controller._update();
  141. [
  142. {x: 256, y: 120, cppx: 246, cppy: 120, cpnx: 272, cpny: 120},
  143. {x: 464, y: 260, cppx: 464, cppy: 252, cpnx: 464, cpny: 266},
  144. {x: 256, y: 260, cppx: 277, cppy: 260, cpnx: 250, cpny: 260},
  145. {x: 200, y: 260, cppx: 200, cppy: 264, cpnx: 200, cpny: 250},
  146. ].forEach(function(expected, i) {
  147. expect(meta.data[i]._model.x).toBeCloseToPixel(expected.x);
  148. expect(meta.data[i]._model.y).toBeCloseToPixel(expected.y);
  149. expect(meta.data[i]._model.controlPointPreviousX).toBeCloseToPixel(expected.cppx);
  150. expect(meta.data[i]._model.controlPointPreviousY).toBeCloseToPixel(expected.cppy);
  151. expect(meta.data[i]._model.controlPointNextX).toBeCloseToPixel(expected.cpnx);
  152. expect(meta.data[i]._model.controlPointNextY).toBeCloseToPixel(expected.cpny);
  153. expect(meta.data[i]._model).toEqual(jasmine.objectContaining({
  154. backgroundColor: Chart.defaults.global.defaultColor,
  155. borderWidth: 1,
  156. borderColor: Chart.defaults.global.defaultColor,
  157. hitRadius: 1,
  158. radius: 3,
  159. pointStyle: 'circle',
  160. skip: false,
  161. tension: 0.1,
  162. }));
  163. });
  164. // Use dataset level styles for lines & points
  165. chart.data.datasets[0].lineTension = 0;
  166. chart.data.datasets[0].backgroundColor = 'rgb(98, 98, 98)';
  167. chart.data.datasets[0].borderColor = 'rgb(8, 8, 8)';
  168. chart.data.datasets[0].borderWidth = 0.55;
  169. chart.data.datasets[0].borderCapStyle = 'butt';
  170. chart.data.datasets[0].borderDash = [2, 3];
  171. chart.data.datasets[0].borderDashOffset = 7;
  172. chart.data.datasets[0].borderJoinStyle = 'miter';
  173. chart.data.datasets[0].fill = false;
  174. // point styles
  175. chart.data.datasets[0].pointRadius = 22;
  176. chart.data.datasets[0].hitRadius = 3.3;
  177. chart.data.datasets[0].pointBackgroundColor = 'rgb(128, 129, 130)';
  178. chart.data.datasets[0].pointBorderColor = 'rgb(56, 57, 58)';
  179. chart.data.datasets[0].pointBorderWidth = 1.123;
  180. meta.controller._update();
  181. expect(meta.dataset._model).toEqual(jasmine.objectContaining({
  182. backgroundColor: 'rgb(98, 98, 98)',
  183. borderCapStyle: 'butt',
  184. borderColor: 'rgb(8, 8, 8)',
  185. borderDash: [2, 3],
  186. borderDashOffset: 7,
  187. borderJoinStyle: 'miter',
  188. borderWidth: 0.55,
  189. fill: false,
  190. }));
  191. // Since tension is now 0, we don't care about the control points
  192. [
  193. {x: 256, y: 120},
  194. {x: 464, y: 260},
  195. {x: 256, y: 260},
  196. {x: 200, y: 260},
  197. ].forEach(function(expected, i) {
  198. expect(meta.data[i]._model.x).toBeCloseToPixel(expected.x);
  199. expect(meta.data[i]._model.y).toBeCloseToPixel(expected.y);
  200. expect(meta.data[i]._model).toEqual(jasmine.objectContaining({
  201. backgroundColor: 'rgb(128, 129, 130)',
  202. borderWidth: 1.123,
  203. borderColor: 'rgb(56, 57, 58)',
  204. hitRadius: 3.3,
  205. radius: 22,
  206. pointStyle: 'circle',
  207. skip: false,
  208. tension: 0,
  209. }));
  210. });
  211. // Use custom styles for lines & first point
  212. meta.dataset.custom = {
  213. backgroundColor: 'rgb(55, 55, 54)',
  214. borderColor: 'rgb(8, 7, 6)',
  215. borderWidth: 0.3,
  216. borderCapStyle: 'square',
  217. borderDash: [4, 3],
  218. borderDashOffset: 4.4,
  219. borderJoinStyle: 'round',
  220. fill: true,
  221. };
  222. // point styles
  223. meta.data[0].custom = {
  224. radius: 2.2,
  225. backgroundColor: 'rgb(0, 1, 3)',
  226. borderColor: 'rgb(4, 6, 8)',
  227. borderWidth: 0.787,
  228. tension: 0.15,
  229. skip: true,
  230. hitRadius: 5,
  231. };
  232. meta.controller._update();
  233. expect(meta.dataset._model).toEqual(jasmine.objectContaining({
  234. backgroundColor: 'rgb(55, 55, 54)',
  235. borderCapStyle: 'square',
  236. borderColor: 'rgb(8, 7, 6)',
  237. borderDash: [4, 3],
  238. borderDashOffset: 4.4,
  239. borderJoinStyle: 'round',
  240. borderWidth: 0.3,
  241. fill: true,
  242. }));
  243. expect(meta.data[0]._model.x).toBeCloseToPixel(256);
  244. expect(meta.data[0]._model.y).toBeCloseToPixel(120);
  245. expect(meta.data[0]._model.controlPointPreviousX).toBeCloseToPixel(241);
  246. expect(meta.data[0]._model.controlPointPreviousY).toBeCloseToPixel(120);
  247. expect(meta.data[0]._model.controlPointNextX).toBeCloseToPixel(281);
  248. expect(meta.data[0]._model.controlPointNextY).toBeCloseToPixel(120);
  249. expect(meta.data[0]._model).toEqual(jasmine.objectContaining({
  250. radius: 2.2,
  251. backgroundColor: 'rgb(0, 1, 3)',
  252. borderColor: 'rgb(4, 6, 8)',
  253. borderWidth: 0.787,
  254. tension: 0.15,
  255. skip: true,
  256. hitRadius: 5,
  257. }));
  258. });
  259. describe('Interactions', function() {
  260. beforeEach(function() {
  261. this.chart = window.acquireChart({
  262. type: 'radar',
  263. data: {
  264. labels: ['label1', 'label2', 'label3', 'label4'],
  265. datasets: [{
  266. data: [10, 15, 0, 4]
  267. }]
  268. },
  269. options: {
  270. elements: {
  271. point: {
  272. backgroundColor: 'rgb(100, 150, 200)',
  273. borderColor: 'rgb(50, 100, 150)',
  274. borderWidth: 2,
  275. radius: 3
  276. }
  277. }
  278. }
  279. });
  280. });
  281. it ('should handle default hover styles', function() {
  282. var chart = this.chart;
  283. var point = chart.getDatasetMeta(0).data[0];
  284. jasmine.triggerMouseEvent(chart, 'mousemove', point);
  285. expect(point._model.backgroundColor).toBe('rgb(49, 135, 221)');
  286. expect(point._model.borderColor).toBe('rgb(22, 89, 156)');
  287. expect(point._model.borderWidth).toBe(1);
  288. expect(point._model.radius).toBe(4);
  289. jasmine.triggerMouseEvent(chart, 'mouseout', point);
  290. expect(point._model.backgroundColor).toBe('rgb(100, 150, 200)');
  291. expect(point._model.borderColor).toBe('rgb(50, 100, 150)');
  292. expect(point._model.borderWidth).toBe(2);
  293. expect(point._model.radius).toBe(3);
  294. });
  295. it ('should handle hover styles defined via dataset properties', function() {
  296. var chart = this.chart;
  297. var point = chart.getDatasetMeta(0).data[0];
  298. Chart.helpers.merge(chart.data.datasets[0], {
  299. hoverBackgroundColor: 'rgb(200, 100, 150)',
  300. hoverBorderColor: 'rgb(150, 50, 100)',
  301. hoverBorderWidth: 8.4,
  302. hoverRadius: 4.2
  303. });
  304. chart.update();
  305. jasmine.triggerMouseEvent(chart, 'mousemove', point);
  306. expect(point._model.backgroundColor).toBe('rgb(200, 100, 150)');
  307. expect(point._model.borderColor).toBe('rgb(150, 50, 100)');
  308. expect(point._model.borderWidth).toBe(8.4);
  309. expect(point._model.radius).toBe(4.2);
  310. jasmine.triggerMouseEvent(chart, 'mouseout', point);
  311. expect(point._model.backgroundColor).toBe('rgb(100, 150, 200)');
  312. expect(point._model.borderColor).toBe('rgb(50, 100, 150)');
  313. expect(point._model.borderWidth).toBe(2);
  314. expect(point._model.radius).toBe(3);
  315. });
  316. it ('should handle hover styles defined via element options', function() {
  317. var chart = this.chart;
  318. var point = chart.getDatasetMeta(0).data[0];
  319. Chart.helpers.merge(chart.options.elements.point, {
  320. hoverBackgroundColor: 'rgb(200, 100, 150)',
  321. hoverBorderColor: 'rgb(150, 50, 100)',
  322. hoverBorderWidth: 8.4,
  323. hoverRadius: 4.2
  324. });
  325. chart.update();
  326. jasmine.triggerMouseEvent(chart, 'mousemove', point);
  327. expect(point._model.backgroundColor).toBe('rgb(200, 100, 150)');
  328. expect(point._model.borderColor).toBe('rgb(150, 50, 100)');
  329. expect(point._model.borderWidth).toBe(8.4);
  330. expect(point._model.radius).toBe(4.2);
  331. jasmine.triggerMouseEvent(chart, 'mouseout', point);
  332. expect(point._model.backgroundColor).toBe('rgb(100, 150, 200)');
  333. expect(point._model.borderColor).toBe('rgb(50, 100, 150)');
  334. expect(point._model.borderWidth).toBe(2);
  335. expect(point._model.radius).toBe(3);
  336. });
  337. it ('should handle hover styles defined via element custom', function() {
  338. var chart = this.chart;
  339. var point = chart.getDatasetMeta(0).data[0];
  340. point.custom = {
  341. hoverBackgroundColor: 'rgb(200, 100, 150)',
  342. hoverBorderColor: 'rgb(150, 50, 100)',
  343. hoverBorderWidth: 8.4,
  344. hoverRadius: 4.2
  345. };
  346. chart.update();
  347. jasmine.triggerMouseEvent(chart, 'mousemove', point);
  348. expect(point._model.backgroundColor).toBe('rgb(200, 100, 150)');
  349. expect(point._model.borderColor).toBe('rgb(150, 50, 100)');
  350. expect(point._model.borderWidth).toBe(8.4);
  351. expect(point._model.radius).toBe(4.2);
  352. jasmine.triggerMouseEvent(chart, 'mouseout', point);
  353. expect(point._model.backgroundColor).toBe('rgb(100, 150, 200)');
  354. expect(point._model.borderColor).toBe('rgb(50, 100, 150)');
  355. expect(point._model.borderWidth).toBe(2);
  356. expect(point._model.radius).toBe(3);
  357. });
  358. });
  359. it('should allow pointBorderWidth to be set to 0', function() {
  360. var chart = window.acquireChart({
  361. type: 'radar',
  362. data: {
  363. datasets: [{
  364. data: [10, 15, 0, 4],
  365. pointBorderWidth: 0
  366. }],
  367. labels: ['label1', 'label2', 'label3', 'label4']
  368. }
  369. });
  370. var meta = chart.getDatasetMeta(0);
  371. var point = meta.data[0];
  372. expect(point._model.borderWidth).toBe(0);
  373. });
  374. it('should use the pointRadius setting over the radius setting', function() {
  375. var chart = window.acquireChart({
  376. type: 'radar',
  377. data: {
  378. datasets: [{
  379. data: [10, 15, 0, 4],
  380. pointRadius: 10,
  381. radius: 15,
  382. }, {
  383. data: [20, 20, 20, 20],
  384. radius: 20
  385. }],
  386. labels: ['label1', 'label2', 'label3', 'label4']
  387. }
  388. });
  389. var meta0 = chart.getDatasetMeta(0);
  390. var meta1 = chart.getDatasetMeta(1);
  391. expect(meta0.data[0]._model.radius).toBe(10);
  392. expect(meta1.data[0]._model.radius).toBe(20);
  393. });
  394. it('should return id for value scale', function() {
  395. var chart = window.acquireChart({
  396. type: 'radar',
  397. data: {
  398. datasets: [{
  399. data: [10, 15, 0, 4],
  400. pointBorderWidth: 0
  401. }],
  402. labels: ['label1', 'label2', 'label3', 'label4']
  403. },
  404. options: {
  405. scale: {id: 'test'}
  406. }
  407. });
  408. var controller = chart.getDatasetMeta(0).controller;
  409. expect(controller._getValueScaleId()).toBe('test');
  410. });
  411. });