NumericalExpressionDataToNodeConverter.spec.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import 'reflect-metadata';
  2. import * as ESTree from 'estree';
  3. import { assert } from 'chai';
  4. import { TNumberNumericalExpressionData } from '../../../../src/types/analyzers/number-numerical-expression-analyzer/TNumberNumericalExpressionData';
  5. import { NodeFactory } from '../../../../src/node/NodeFactory';
  6. import { NumericalExpressionDataToNodeConverter } from '../../../../src/node/NumericalExpressionDataToNodeConverter';
  7. describe('NumericalExpressionDataToNodeConverter', () => {
  8. describe('convertIntegerNumberData', () => {
  9. describe('Variant #1: base', () => {
  10. const numberNumericalExpressionData: TNumberNumericalExpressionData = [
  11. 1, [-2, 3], 4
  12. ];
  13. const expectedExpressionNode: ESTree.Expression = NodeFactory.binaryExpressionNode(
  14. '+',
  15. NodeFactory.binaryExpressionNode(
  16. '+',
  17. NodeFactory.literalNode(1),
  18. NodeFactory.binaryExpressionNode(
  19. '*',
  20. NodeFactory.unaryExpressionNode(
  21. '-',
  22. NodeFactory.literalNode(2),
  23. ),
  24. NodeFactory.literalNode(3)
  25. ),
  26. ),
  27. NodeFactory.literalNode(4)
  28. );
  29. let expressionNode: ESTree.Expression;
  30. before(() => {
  31. expressionNode = NumericalExpressionDataToNodeConverter.convertIntegerNumberData(
  32. numberNumericalExpressionData,
  33. (number: number, isPositiveNumber: boolean): ESTree.Expression => {
  34. const numberLiteralNode: ESTree.Literal = NodeFactory.literalNode(number);
  35. return isPositiveNumber
  36. ? numberLiteralNode
  37. : NodeFactory.unaryExpressionNode(
  38. '-',
  39. numberLiteralNode
  40. );
  41. }
  42. );
  43. });
  44. it('should convert number numerical expression data to expression node', () => {
  45. assert.deepEqual(expressionNode, expectedExpressionNode);
  46. });
  47. });
  48. });
  49. describe('convertFloatNumberData', () => {
  50. describe('Variant #1: base', () => {
  51. const integerNumberNumericalExpressionData: TNumberNumericalExpressionData = [
  52. 1, [-2, 3], 4
  53. ];
  54. const decimalPart: number = 0.000000001;
  55. const expectedExpressionNode: ESTree.Expression = NodeFactory.binaryExpressionNode(
  56. '+',
  57. NodeFactory.binaryExpressionNode(
  58. '+',
  59. NodeFactory.binaryExpressionNode(
  60. '+',
  61. NodeFactory.literalNode(1),
  62. NodeFactory.binaryExpressionNode(
  63. '*',
  64. NodeFactory.unaryExpressionNode(
  65. '-',
  66. NodeFactory.literalNode(2),
  67. ),
  68. NodeFactory.literalNode(3)
  69. ),
  70. ),
  71. NodeFactory.literalNode(4)
  72. ),
  73. NodeFactory.literalNode(decimalPart)
  74. );
  75. let expressionNode: ESTree.Expression;
  76. before(() => {
  77. expressionNode = NumericalExpressionDataToNodeConverter.convertFloatNumberData(
  78. integerNumberNumericalExpressionData,
  79. decimalPart,
  80. (number: number, isPositiveNumber: boolean): ESTree.Expression => {
  81. const numberLiteralNode: ESTree.Literal = NodeFactory.literalNode(number);
  82. return isPositiveNumber
  83. ? numberLiteralNode
  84. : NodeFactory.unaryExpressionNode(
  85. '-',
  86. numberLiteralNode
  87. );
  88. }
  89. );
  90. });
  91. it('should convert number numerical expression data to expression node', () => {
  92. assert.deepEqual(expressionNode, expectedExpressionNode);
  93. });
  94. });
  95. });
  96. });