controller.radar.tests.js 14 KB

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