core.datasetController.tests.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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. it('should synchronize metadata when data are inserted or removed', function() {
  37. var data = [0, 1, 2, 3, 4, 5];
  38. var chart = acquireChart({
  39. type: 'line',
  40. data: {
  41. datasets: [{
  42. data: data
  43. }]
  44. }
  45. });
  46. var meta = chart.getDatasetMeta(0);
  47. var first, second, last;
  48. first = meta.data[0];
  49. last = meta.data[5];
  50. data.push(6, 7, 8);
  51. data.push(9);
  52. expect(meta.data.length).toBe(10);
  53. expect(meta.data[0]).toBe(first);
  54. expect(meta.data[5]).toBe(last);
  55. last = meta.data[9];
  56. data.pop();
  57. expect(meta.data.length).toBe(9);
  58. expect(meta.data[0]).toBe(first);
  59. expect(meta.data.indexOf(last)).toBe(-1);
  60. last = meta.data[8];
  61. data.shift();
  62. data.shift();
  63. data.shift();
  64. expect(meta.data.length).toBe(6);
  65. expect(meta.data.indexOf(first)).toBe(-1);
  66. expect(meta.data[5]).toBe(last);
  67. first = meta.data[0];
  68. second = meta.data[1];
  69. last = meta.data[5];
  70. data.splice(1, 4, 10, 11);
  71. expect(meta.data.length).toBe(4);
  72. expect(meta.data[0]).toBe(first);
  73. expect(meta.data[3]).toBe(last);
  74. expect(meta.data.indexOf(second)).toBe(-1);
  75. data.unshift(12, 13, 14, 15);
  76. data.unshift(16, 17);
  77. expect(meta.data.length).toBe(10);
  78. expect(meta.data[6]).toBe(first);
  79. expect(meta.data[9]).toBe(last);
  80. });
  81. it('should re-synchronize metadata when the data object reference changes', function() {
  82. var data0 = [0, 1, 2, 3, 4, 5];
  83. var data1 = [6, 7, 8];
  84. var chart = acquireChart({
  85. type: 'line',
  86. data: {
  87. datasets: [{
  88. data: data0
  89. }]
  90. }
  91. });
  92. var meta = chart.getDatasetMeta(0);
  93. expect(meta.data.length).toBe(6);
  94. chart.data.datasets[0].data = data1;
  95. chart.update();
  96. expect(meta.data.length).toBe(3);
  97. data1.push(9, 10, 11);
  98. expect(meta.data.length).toBe(6);
  99. });
  100. it('should re-synchronize metadata when data are unusually altered', function() {
  101. var data = [0, 1, 2, 3, 4, 5];
  102. var chart = acquireChart({
  103. type: 'line',
  104. data: {
  105. datasets: [{
  106. data: data
  107. }]
  108. }
  109. });
  110. var meta = chart.getDatasetMeta(0);
  111. expect(meta.data.length).toBe(6);
  112. data.length = 2;
  113. chart.update();
  114. expect(meta.data.length).toBe(2);
  115. data.length = 42;
  116. chart.update();
  117. expect(meta.data.length).toBe(42);
  118. });
  119. it('should cleanup attached properties when the reference changes or when the chart is destroyed', function() {
  120. var data0 = [0, 1, 2, 3, 4, 5];
  121. var data1 = [6, 7, 8];
  122. var chart = acquireChart({
  123. type: 'line',
  124. data: {
  125. datasets: [{
  126. data: data0
  127. }]
  128. }
  129. });
  130. var hooks = ['push', 'pop', 'shift', 'splice', 'unshift'];
  131. expect(data0._chartjs).toBeDefined();
  132. hooks.forEach(function(hook) {
  133. expect(data0[hook]).not.toBe(Array.prototype[hook]);
  134. });
  135. expect(data1._chartjs).not.toBeDefined();
  136. hooks.forEach(function(hook) {
  137. expect(data1[hook]).toBe(Array.prototype[hook]);
  138. });
  139. chart.data.datasets[0].data = data1;
  140. chart.update();
  141. expect(data0._chartjs).not.toBeDefined();
  142. hooks.forEach(function(hook) {
  143. expect(data0[hook]).toBe(Array.prototype[hook]);
  144. });
  145. expect(data1._chartjs).toBeDefined();
  146. hooks.forEach(function(hook) {
  147. expect(data1[hook]).not.toBe(Array.prototype[hook]);
  148. });
  149. chart.destroy();
  150. expect(data1._chartjs).not.toBeDefined();
  151. hooks.forEach(function(hook) {
  152. expect(data1[hook]).toBe(Array.prototype[hook]);
  153. });
  154. });
  155. });