NumberNumericalExpressionAnalyzer.spec.ts 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. import 'reflect-metadata';
  2. import { assert } from 'chai';
  3. import { ServiceIdentifiers } from '../../../../src/container/ServiceIdentifiers';
  4. import { TNumberNumericalExpressionData } from '../../../../src/types/analyzers/number-numerical-expression-analyzer/TNumberNumericalExpressionData';
  5. import { IInversifyContainerFacade } from '../../../../src/interfaces/container/IInversifyContainerFacade';
  6. import { INumberNumericalExpressionAnalyzer } from '../../../../src/interfaces/analyzers/number-numerical-expression-analyzer/INumberNumericalExpressionAnalyzer';
  7. import { InversifyContainerFacade } from '../../../../src/container/InversifyContainerFacade';
  8. /**
  9. * @param {TNumberNumericalExpressionData} data
  10. * @returns {string}
  11. */
  12. const numberNumericalExpressionDataToString = (data: TNumberNumericalExpressionData) =>
  13. data
  14. .map((part: number | number[]) => Array.isArray(part) ? part.join('*') : part)
  15. .join('+')
  16. .replace(/\+-/g, '-');
  17. describe('NumberNumericalExpressionAnalyzer', function() {
  18. let numberNumericalExpressionAnalyzer: INumberNumericalExpressionAnalyzer;
  19. this.timeout(10000);
  20. before(() => {
  21. const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade();
  22. inversifyContainerFacade.load('', '', {});
  23. numberNumericalExpressionAnalyzer = inversifyContainerFacade
  24. .get<INumberNumericalExpressionAnalyzer>(ServiceIdentifiers.INumberNumericalExpressionAnalyzer);
  25. });
  26. describe('analyze', () => {
  27. let evaluatedResult: number;
  28. describe('Positive numbers', () => {
  29. describe('Variant #1: positive number', () => {
  30. const number: number = 1234;
  31. before(() => {
  32. const numberNumericalExpressionData: TNumberNumericalExpressionData =
  33. numberNumericalExpressionAnalyzer.analyze(number);
  34. evaluatedResult = eval(numberNumericalExpressionDataToString(numberNumericalExpressionData));
  35. });
  36. it('should return correct number numerical expression data', () => {
  37. assert.equal(number, evaluatedResult);
  38. });
  39. });
  40. describe('Variant #2: positive zero number', () => {
  41. const number: number = 0;
  42. before(() => {
  43. const numberNumericalExpressionData: TNumberNumericalExpressionData =
  44. numberNumericalExpressionAnalyzer.analyze(number);
  45. evaluatedResult = eval(numberNumericalExpressionDataToString(numberNumericalExpressionData));
  46. });
  47. it('should return correct number numerical expression data', () => {
  48. assert.equal(number, evaluatedResult);
  49. });
  50. });
  51. describe('Variant #3: positive big number', () => {
  52. const number: number = Number.MAX_SAFE_INTEGER;
  53. before(() => {
  54. const numberNumericalExpressionData: TNumberNumericalExpressionData =
  55. numberNumericalExpressionAnalyzer.analyze(number);
  56. evaluatedResult = eval(numberNumericalExpressionDataToString(numberNumericalExpressionData));
  57. });
  58. it('should return correct number numerical expression data', () => {
  59. assert.equal(number, evaluatedResult);
  60. });
  61. });
  62. describe('Variant #4: positive unsafe big number', () => {
  63. const number: number = Number.MAX_SAFE_INTEGER + 1;
  64. before(() => {
  65. const numberNumericalExpressionData: TNumberNumericalExpressionData =
  66. numberNumericalExpressionAnalyzer.analyze(number);
  67. evaluatedResult = eval(numberNumericalExpressionDataToString(numberNumericalExpressionData));
  68. });
  69. it('should return correct number numerical expression data', () => {
  70. assert.equal(number, evaluatedResult);
  71. });
  72. });
  73. });
  74. describe('Negative numbers', () => {
  75. describe('Variant #1: negative number', () => {
  76. const number: number = -1234;
  77. before(() => {
  78. const numberNumericalExpressionData: TNumberNumericalExpressionData =
  79. numberNumericalExpressionAnalyzer.analyze(number);
  80. evaluatedResult = eval(numberNumericalExpressionDataToString(numberNumericalExpressionData));
  81. });
  82. it('should return correct number numerical expression data', () => {
  83. assert.equal(number, evaluatedResult);
  84. });
  85. });
  86. describe('Variant #2: negative zero number', () => {
  87. const number: number = -0;
  88. before(() => {
  89. const numberNumericalExpressionData: TNumberNumericalExpressionData =
  90. numberNumericalExpressionAnalyzer.analyze(number);
  91. evaluatedResult = eval(numberNumericalExpressionDataToString(numberNumericalExpressionData));
  92. });
  93. it('should return correct number numerical expression data', () => {
  94. assert.equal(number, evaluatedResult);
  95. });
  96. });
  97. describe('Variant #3: negative big number', () => {
  98. const number: number = Number.MIN_SAFE_INTEGER;
  99. before(() => {
  100. const numberNumericalExpressionData: TNumberNumericalExpressionData =
  101. numberNumericalExpressionAnalyzer.analyze(number);
  102. evaluatedResult = eval(numberNumericalExpressionDataToString(numberNumericalExpressionData));
  103. });
  104. it('should return correct number numerical expression data', () => {
  105. assert.equal(number, evaluatedResult);
  106. });
  107. });
  108. describe('Variant #4: negative unsafe number', () => {
  109. const number: number = Number.MIN_SAFE_INTEGER - 1;
  110. before(() => {
  111. const numberNumericalExpressionData: TNumberNumericalExpressionData =
  112. numberNumericalExpressionAnalyzer.analyze(number);
  113. evaluatedResult = eval(numberNumericalExpressionDataToString(numberNumericalExpressionData));
  114. });
  115. it('should return correct number numerical expression data', () => {
  116. assert.equal(number, evaluatedResult);
  117. });
  118. });
  119. });
  120. describe('NaN', () => {
  121. const number: number = NaN;
  122. let testFunc: () => void;
  123. before(() => {
  124. testFunc = () => numberNumericalExpressionAnalyzer.analyze(number);
  125. });
  126. it('should throw error', () => {
  127. assert.throw(testFunc, 'Given value is NaN');
  128. });
  129. });
  130. });
  131. });