core.datasetController.tests.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. describe('Chart.DatasetController', function() {
  2. it('should listen for dataset data insertions or removals', function() {
  3. var data = [0, 1, 2, 3, 4, 5];
  4. var chart = acquireChart({
  5. type: 'line',
  6. data: {
  7. datasets: [{
  8. data: data
  9. }]
  10. }
  11. });
  12. var controller = chart.getDatasetMeta(0).controller;
  13. var methods = [
  14. 'onDataPush',
  15. 'onDataPop',
  16. 'onDataShift',
  17. 'onDataSplice',
  18. 'onDataUnshift'
  19. ];
  20. methods.forEach(function(method) {
  21. spyOn(controller, method);
  22. });
  23. data.push(6, 7, 8);
  24. data.push(9);
  25. data.pop();
  26. data.shift();
  27. data.shift();
  28. data.shift();
  29. data.splice(1, 4, 10, 11);
  30. data.unshift(12, 13, 14, 15);
  31. data.unshift(16, 17);
  32. [2, 1, 3, 1, 2].forEach(function(expected, index) {
  33. expect(controller[methods[index]].calls.count()).toBe(expected);
  34. });
  35. });
  36. describe('inextensible data', function() {
  37. it('should handle a frozen data object', function() {
  38. function createChart() {
  39. var data = Object.freeze([0, 1, 2, 3, 4, 5]);
  40. expect(Object.isExtensible(data)).toBeFalsy();
  41. var chart = acquireChart({
  42. type: 'line',
  43. data: {
  44. datasets: [{
  45. data: data
  46. }]
  47. }
  48. });
  49. var dataset = chart.data.datasets[0];
  50. dataset.data = Object.freeze([5, 4, 3, 2, 1, 0]);
  51. expect(Object.isExtensible(dataset.data)).toBeFalsy();
  52. chart.update();
  53. // Tests that the unlisten path also works for frozen objects
  54. chart.destroy();
  55. }
  56. expect(createChart).not.toThrow();
  57. });
  58. it('should handle a sealed data object', function() {
  59. function createChart() {
  60. var data = Object.seal([0, 1, 2, 3, 4, 5]);
  61. expect(Object.isExtensible(data)).toBeFalsy();
  62. var chart = acquireChart({
  63. type: 'line',
  64. data: {
  65. datasets: [{
  66. data: data
  67. }]
  68. }
  69. });
  70. var dataset = chart.data.datasets[0];
  71. dataset.data = Object.seal([5, 4, 3, 2, 1, 0]);
  72. expect(Object.isExtensible(dataset.data)).toBeFalsy();
  73. chart.update();
  74. // Tests that the unlisten path also works for frozen objects
  75. chart.destroy();
  76. }
  77. expect(createChart).not.toThrow();
  78. });
  79. it('should handle an unextendable data object', function() {
  80. function createChart() {
  81. var data = Object.preventExtensions([0, 1, 2, 3, 4, 5]);
  82. expect(Object.isExtensible(data)).toBeFalsy();
  83. var chart = acquireChart({
  84. type: 'line',
  85. data: {
  86. datasets: [{
  87. data: data
  88. }]
  89. }
  90. });
  91. var dataset = chart.data.datasets[0];
  92. dataset.data = Object.preventExtensions([5, 4, 3, 2, 1, 0]);
  93. expect(Object.isExtensible(dataset.data)).toBeFalsy();
  94. chart.update();
  95. // Tests that the unlisten path also works for frozen objects
  96. chart.destroy();
  97. }
  98. expect(createChart).not.toThrow();
  99. });
  100. });
  101. it('should synchronize metadata when data are inserted or removed', function() {
  102. var data = [0, 1, 2, 3, 4, 5];
  103. var chart = acquireChart({
  104. type: 'line',
  105. data: {
  106. datasets: [{
  107. data: data
  108. }]
  109. }
  110. });
  111. var meta = chart.getDatasetMeta(0);
  112. var first, second, last;
  113. first = meta.data[0];
  114. last = meta.data[5];
  115. data.push(6, 7, 8);
  116. data.push(9);
  117. expect(meta.data.length).toBe(10);
  118. expect(meta.data[0]).toBe(first);
  119. expect(meta.data[5]).toBe(last);
  120. last = meta.data[9];
  121. data.pop();
  122. expect(meta.data.length).toBe(9);
  123. expect(meta.data[0]).toBe(first);
  124. expect(meta.data.indexOf(last)).toBe(-1);
  125. last = meta.data[8];
  126. data.shift();
  127. data.shift();
  128. data.shift();
  129. expect(meta.data.length).toBe(6);
  130. expect(meta.data.indexOf(first)).toBe(-1);
  131. expect(meta.data[5]).toBe(last);
  132. first = meta.data[0];
  133. second = meta.data[1];
  134. last = meta.data[5];
  135. data.splice(1, 4, 10, 11);
  136. expect(meta.data.length).toBe(4);
  137. expect(meta.data[0]).toBe(first);
  138. expect(meta.data[3]).toBe(last);
  139. expect(meta.data.indexOf(second)).toBe(-1);
  140. data.unshift(12, 13, 14, 15);
  141. data.unshift(16, 17);
  142. expect(meta.data.length).toBe(10);
  143. expect(meta.data[6]).toBe(first);
  144. expect(meta.data[9]).toBe(last);
  145. });
  146. it('should re-synchronize metadata when the data object reference changes', function() {
  147. var data0 = [0, 1, 2, 3, 4, 5];
  148. var data1 = [6, 7, 8];
  149. var chart = acquireChart({
  150. type: 'line',
  151. data: {
  152. datasets: [{
  153. data: data0
  154. }]
  155. }
  156. });
  157. var meta = chart.getDatasetMeta(0);
  158. expect(meta.data.length).toBe(6);
  159. chart.data.datasets[0].data = data1;
  160. chart.update();
  161. expect(meta.data.length).toBe(3);
  162. data1.push(9, 10, 11);
  163. expect(meta.data.length).toBe(6);
  164. });
  165. it('should re-synchronize metadata when data are unusually altered', function() {
  166. var data = [0, 1, 2, 3, 4, 5];
  167. var chart = acquireChart({
  168. type: 'line',
  169. data: {
  170. datasets: [{
  171. data: data
  172. }]
  173. }
  174. });
  175. var meta = chart.getDatasetMeta(0);
  176. expect(meta.data.length).toBe(6);
  177. data.length = 2;
  178. chart.update();
  179. expect(meta.data.length).toBe(2);
  180. data.length = 42;
  181. chart.update();
  182. expect(meta.data.length).toBe(42);
  183. });
  184. it('should re-synchronize metadata when scaleID changes', function() {
  185. var chart = acquireChart({
  186. type: 'line',
  187. data: {
  188. datasets: [{
  189. data: [],
  190. xAxisID: 'firstXScaleID',
  191. yAxisID: 'firstYScaleID',
  192. }]
  193. },
  194. options: {
  195. scales: {
  196. xAxes: [{
  197. id: 'firstXScaleID'
  198. }, {
  199. id: 'secondXScaleID'
  200. }],
  201. yAxes: [{
  202. id: 'firstYScaleID'
  203. }, {
  204. id: 'secondYScaleID'
  205. }]
  206. }
  207. }
  208. });
  209. var meta = chart.getDatasetMeta(0);
  210. expect(meta.xAxisID).toBe('firstXScaleID');
  211. expect(meta.yAxisID).toBe('firstYScaleID');
  212. chart.data.datasets[0].xAxisID = 'secondXScaleID';
  213. chart.data.datasets[0].yAxisID = 'secondYScaleID';
  214. chart.update();
  215. expect(meta.xAxisID).toBe('secondXScaleID');
  216. expect(meta.yAxisID).toBe('secondYScaleID');
  217. });
  218. it('should cleanup attached properties when the reference changes or when the chart is destroyed', function() {
  219. var data0 = [0, 1, 2, 3, 4, 5];
  220. var data1 = [6, 7, 8];
  221. var chart = acquireChart({
  222. type: 'line',
  223. data: {
  224. datasets: [{
  225. data: data0
  226. }]
  227. }
  228. });
  229. var hooks = ['push', 'pop', 'shift', 'splice', 'unshift'];
  230. expect(data0._chartjs).toBeDefined();
  231. hooks.forEach(function(hook) {
  232. expect(data0[hook]).not.toBe(Array.prototype[hook]);
  233. });
  234. expect(data1._chartjs).not.toBeDefined();
  235. hooks.forEach(function(hook) {
  236. expect(data1[hook]).toBe(Array.prototype[hook]);
  237. });
  238. chart.data.datasets[0].data = data1;
  239. chart.update();
  240. expect(data0._chartjs).not.toBeDefined();
  241. hooks.forEach(function(hook) {
  242. expect(data0[hook]).toBe(Array.prototype[hook]);
  243. });
  244. expect(data1._chartjs).toBeDefined();
  245. hooks.forEach(function(hook) {
  246. expect(data1[hook]).not.toBe(Array.prototype[hook]);
  247. });
  248. chart.destroy();
  249. expect(data1._chartjs).not.toBeDefined();
  250. hooks.forEach(function(hook) {
  251. expect(data1[hook]).toBe(Array.prototype[hook]);
  252. });
  253. });
  254. });