numericValidator.spec.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. describe('numericValidator', () => {
  2. const id = 'testContainer';
  3. beforeEach(function() {
  4. this.$container = $(`<div id="${id}"></div>`).appendTo('body');
  5. });
  6. afterEach(function() {
  7. if (this.$container) {
  8. destroy();
  9. this.$container.remove();
  10. }
  11. });
  12. const arrayOfObjects = function() {
  13. return [
  14. { id: 1, name: 'Ted', lastName: 'Right' },
  15. { id: 2, name: 'Frank', lastName: 'Honest' },
  16. { id: 3, name: 'Joan', lastName: 'Well' },
  17. { id: 4, name: 'Sid', lastName: 'Strong' },
  18. { id: 5, name: 'Jane', lastName: 'Neat' },
  19. { id: 6, name: 'Chuck', lastName: 'Jackson' },
  20. { id: 7, name: 'Meg', lastName: 'Jansen' },
  21. { id: 8, name: 'Rob', lastName: 'Norris' },
  22. { id: 9, name: 'Sean', lastName: 'O\'Hara' },
  23. { id: 10, name: 'Eve', lastName: 'Branson' }
  24. ];
  25. };
  26. it('should validate an empty string (default behavior)', (done) => {
  27. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  28. handsontable({
  29. data: arrayOfObjects(),
  30. columns: [
  31. { data: 'id', type: 'numeric' },
  32. { data: 'name' },
  33. { data: 'lastName' }
  34. ],
  35. afterValidate: onAfterValidate
  36. });
  37. setDataAtCell(2, 0, '');
  38. setTimeout(() => {
  39. expect(onAfterValidate).toHaveBeenCalledWith(true, '', 2, 'id', undefined, undefined);
  40. done();
  41. }, 100);
  42. });
  43. it('should not validate non numeric string', (done) => {
  44. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  45. handsontable({
  46. data: arrayOfObjects(),
  47. columns: [
  48. { data: 'id', type: 'numeric' },
  49. { data: 'name' },
  50. { data: 'lastName' }
  51. ],
  52. afterValidate: onAfterValidate
  53. });
  54. setDataAtCell(2, 0, 'test');
  55. setTimeout(() => {
  56. expect(onAfterValidate).toHaveBeenCalledWith(false, 'test', 2, 'id', undefined, undefined);
  57. done();
  58. }, 100);
  59. });
  60. it('should validate numeric string', (done) => {
  61. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  62. handsontable({
  63. data: arrayOfObjects(),
  64. columns: [
  65. { data: 'id', type: 'numeric' },
  66. { data: 'name' },
  67. { data: 'lastName' }
  68. ],
  69. afterValidate: onAfterValidate
  70. });
  71. setDataAtCell(2, 0, '123');
  72. setTimeout(() => {
  73. expect(onAfterValidate).toHaveBeenCalledWith(true, 123, 2, 'id', undefined, undefined);
  74. done();
  75. }, 100);
  76. });
  77. it('should validate signed numeric string', (done) => {
  78. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  79. handsontable({
  80. data: arrayOfObjects(),
  81. columns: [
  82. { data: 'id', type: 'numeric' },
  83. { data: 'name' },
  84. { data: 'lastName' }
  85. ],
  86. afterValidate: onAfterValidate
  87. });
  88. setDataAtCell(2, 0, '-123');
  89. setTimeout(() => {
  90. expect(onAfterValidate).toHaveBeenCalledWith(true, -123, 2, 'id', undefined, undefined);
  91. done();
  92. }, 100);
  93. });
  94. it('should validate large-number scientific notation', (done) => {
  95. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  96. handsontable({
  97. data: arrayOfObjects(),
  98. columns: [
  99. { data: 'id', type: 'numeric' },
  100. { data: 'name' },
  101. { data: 'lastName' }
  102. ],
  103. afterValidate: onAfterValidate
  104. });
  105. setDataAtCell(2, 0, '1e+23');
  106. setTimeout(() => {
  107. expect(onAfterValidate).toHaveBeenCalledWith(true, 1e+23, 2, 'id', undefined, undefined);
  108. done();
  109. }, 100);
  110. });
  111. it('should validate small-number scientific notation', (done) => {
  112. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  113. handsontable({
  114. data: arrayOfObjects(),
  115. columns: [
  116. { data: 'id', type: 'numeric' },
  117. { data: 'name' },
  118. { data: 'lastName' }
  119. ],
  120. afterValidate: onAfterValidate
  121. });
  122. setDataAtCell(2, 0, '1e-23');
  123. setTimeout(() => {
  124. expect(onAfterValidate).toHaveBeenCalledWith(true, 1e-23, 2, 'id', undefined, undefined);
  125. done();
  126. }, 100);
  127. });
  128. describe('allowEmpty', () => {
  129. it('should not validate an empty string when allowEmpty is set as `false`', (done) => {
  130. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  131. handsontable({
  132. data: arrayOfObjects(),
  133. columns: [
  134. { data: 'id', type: 'numeric', allowEmpty: false },
  135. { data: 'name' },
  136. { data: 'lastName' }
  137. ],
  138. afterValidate: onAfterValidate
  139. });
  140. setDataAtCell(2, 0, '');
  141. setTimeout(() => {
  142. expect(onAfterValidate).toHaveBeenCalledWith(false, '', 2, 'id', undefined, undefined);
  143. done();
  144. }, 100);
  145. });
  146. it('should not validate `null` when allowEmpty is set as `false`', (done) => {
  147. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  148. handsontable({
  149. data: arrayOfObjects(),
  150. columns: [
  151. { data: 'id', type: 'numeric', allowEmpty: false },
  152. { data: 'name' },
  153. { data: 'lastName' }
  154. ],
  155. afterValidate: onAfterValidate
  156. });
  157. setDataAtCell(2, 0, null);
  158. setTimeout(() => {
  159. expect(onAfterValidate).toHaveBeenCalledWith(false, null, 2, 'id', undefined, undefined);
  160. done();
  161. }, 100);
  162. });
  163. it('should not validate `undefined` when allowEmpty is set as `false`', (done) => {
  164. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  165. handsontable({
  166. data: arrayOfObjects(),
  167. columns: [
  168. { data: 'id', type: 'numeric', allowEmpty: false },
  169. { data: 'name' },
  170. { data: 'lastName' }
  171. ],
  172. afterValidate: onAfterValidate
  173. });
  174. setDataAtCell(2, 0, void 0);
  175. setTimeout(() => {
  176. expect(onAfterValidate).toHaveBeenCalledWith(false, void 0, 2, 'id', undefined, undefined);
  177. done();
  178. }, 100);
  179. });
  180. it('should validate 0 when allowEmpty is set as `false`', (done) => {
  181. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  182. handsontable({
  183. data: arrayOfObjects(),
  184. columns: [
  185. { data: 'id', type: 'numeric', allowEmpty: false },
  186. { data: 'name' },
  187. { data: 'lastName' }
  188. ],
  189. afterValidate: onAfterValidate
  190. });
  191. setDataAtCell(2, 0, 0);
  192. setTimeout(() => {
  193. expect(onAfterValidate).toHaveBeenCalledWith(true, 0, 2, 'id', undefined, undefined);
  194. done();
  195. }, 100);
  196. });
  197. it('should add / remove `htInvalid` class properly when validating non-numeric data', (done) => {
  198. const hot = handsontable({
  199. data: [
  200. { id: 1, name: 'Ted', salary: 10000 },
  201. { id: 2, name: 'Frank', salary: '5300' },
  202. { id: 3, name: 'Joan', salary: 'non-numeric value' }
  203. ],
  204. columns: [
  205. { data: 'id' },
  206. { data: 'name' },
  207. { data: 'salary', type: 'numeric', allowInvalid: false }
  208. ]
  209. });
  210. hot.validateCells();
  211. setTimeout(() => {
  212. expect($(getCell(1, 2)).hasClass(hot.getSettings().invalidCellClassName)).toBe(false);
  213. expect($(getCell(2, 2)).hasClass(hot.getSettings().invalidCellClassName)).toBe(true);
  214. setDataAtCell(2, 2, 8000);
  215. }, 200);
  216. setTimeout(() => {
  217. expect($(getCell(2, 2)).hasClass(hot.getSettings().invalidCellClassName)).toBe(false);
  218. done();
  219. }, 400);
  220. });
  221. });
  222. });