StringArrayStorageAnalyzer.spec.ts 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. import 'reflect-metadata';
  2. import { assert } from 'chai';
  3. import * as ESTree from 'estree';
  4. import { ServiceIdentifiers } from '../../../../src/container/ServiceIdentifiers';
  5. import { TInputOptions } from '../../../../src/types/options/TInputOptions';
  6. import { IInversifyContainerFacade } from '../../../../src/interfaces/container/IInversifyContainerFacade';
  7. import { IStringArrayStorageAnalyzer } from '../../../../src/interfaces/analyzers/string-array-storage-analyzer/IStringArrayStorageAnalyzer';
  8. import { IStringArrayStorageItemData } from '../../../../src/interfaces/storages/string-array-storage/IStringArrayStorageItem';
  9. import { InversifyContainerFacade } from '../../../../src/container/InversifyContainerFacade';
  10. import { NodeFactory } from '../../../../src/node/NodeFactory';
  11. import { NodeMetadata } from '../../../../src/node/NodeMetadata';
  12. const getStringArrayStorageAnalyzer = (options: TInputOptions): IStringArrayStorageAnalyzer => {
  13. const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade();
  14. inversifyContainerFacade.load('', '', options);
  15. return inversifyContainerFacade.get<IStringArrayStorageAnalyzer>(ServiceIdentifiers.IStringArrayStorageAnalyzer);
  16. };
  17. describe('StringArrayStorageAnalyzer', () => {
  18. let stringArrayStorageAnalyzer: IStringArrayStorageAnalyzer;
  19. describe('analyze', () => {
  20. describe('Base analyze of the AST tree', () => {
  21. const literalNode1: ESTree.Literal = NodeFactory.literalNode('foo');
  22. const literalNode2: ESTree.Literal = NodeFactory.literalNode('bar');
  23. const literalNode3: ESTree.Literal = NodeFactory.literalNode('baz');
  24. const expectedStringArrayStorageItemData1: IStringArrayStorageItemData = {
  25. encodedValue: 'foo',
  26. decodeKey: null,
  27. index: 0,
  28. value: 'foo'
  29. };
  30. const expectedStringArrayStorageItemData2: IStringArrayStorageItemData = {
  31. encodedValue: 'bar',
  32. decodeKey: null,
  33. index: 1,
  34. value: 'bar'
  35. };
  36. const expectedStringArrayStorageItemData3: undefined = undefined;
  37. let stringArrayStorageItemData1: IStringArrayStorageItemData | undefined;
  38. let stringArrayStorageItemData2: IStringArrayStorageItemData | undefined;
  39. let stringArrayStorageItemData3: IStringArrayStorageItemData | undefined;
  40. before(() => {
  41. stringArrayStorageAnalyzer = getStringArrayStorageAnalyzer({
  42. stringArrayThreshold: 1
  43. });
  44. const astTree: ESTree.Program = NodeFactory.programNode([
  45. NodeFactory.expressionStatementNode(literalNode1),
  46. NodeFactory.expressionStatementNode(literalNode2)
  47. ]);
  48. stringArrayStorageAnalyzer.analyze(astTree);
  49. stringArrayStorageItemData1 = stringArrayStorageAnalyzer.getItemDataForLiteralNode(literalNode1);
  50. stringArrayStorageItemData2 = stringArrayStorageAnalyzer.getItemDataForLiteralNode(literalNode2);
  51. stringArrayStorageItemData3 = stringArrayStorageAnalyzer.getItemDataForLiteralNode(literalNode3);
  52. });
  53. it('Variant #1: should return correct string array storage item data for literal node #1', () => {
  54. assert.deepEqual(stringArrayStorageItemData1, expectedStringArrayStorageItemData1);
  55. });
  56. it('Variant #2: should return correct string array storage item data for literal node #1', () => {
  57. assert.deepEqual(stringArrayStorageItemData2, expectedStringArrayStorageItemData2);
  58. });
  59. it('Variant #3: should return correct string array storage item data for literal node #1', () => {
  60. assert.deepEqual(stringArrayStorageItemData3, expectedStringArrayStorageItemData3);
  61. });
  62. });
  63. describe('Base analyze of the AST tree with string literal nodes with values shorter than allowed length', () => {
  64. const literalNode1: ESTree.Literal = NodeFactory.literalNode('foo');
  65. const literalNode2: ESTree.Literal = NodeFactory.literalNode('ba');
  66. const expectedStringArrayStorageItemData1: IStringArrayStorageItemData = {
  67. encodedValue: 'foo',
  68. decodeKey: null,
  69. index: 0,
  70. value: 'foo'
  71. };
  72. const expectedStringArrayStorageItemData2: undefined = undefined;
  73. let stringArrayStorageItemData1: IStringArrayStorageItemData | undefined;
  74. let stringArrayStorageItemData2: IStringArrayStorageItemData | undefined;
  75. before(() => {
  76. stringArrayStorageAnalyzer = getStringArrayStorageAnalyzer({
  77. stringArrayThreshold: 1
  78. });
  79. const astTree: ESTree.Program = NodeFactory.programNode([
  80. NodeFactory.expressionStatementNode(literalNode1),
  81. NodeFactory.expressionStatementNode(literalNode2)
  82. ]);
  83. stringArrayStorageAnalyzer.analyze(astTree);
  84. stringArrayStorageItemData1 = stringArrayStorageAnalyzer.getItemDataForLiteralNode(literalNode1);
  85. stringArrayStorageItemData2 = stringArrayStorageAnalyzer.getItemDataForLiteralNode(literalNode2);
  86. });
  87. it('Variant #1: should return correct string array storage item data for literal node #1', () => {
  88. assert.deepEqual(stringArrayStorageItemData1, expectedStringArrayStorageItemData1);
  89. });
  90. it('Variant #2: should return correct string array storage item data for literal node #1', () => {
  91. assert.deepEqual(stringArrayStorageItemData2, expectedStringArrayStorageItemData2);
  92. });
  93. });
  94. describe('Base analyze of the AST tree with number literal nodes', () => {
  95. const literalNode1: ESTree.Literal = NodeFactory.literalNode('foo');
  96. const literalNode2: ESTree.Literal = NodeFactory.literalNode(1);
  97. const expectedStringArrayStorageItemData1: IStringArrayStorageItemData = {
  98. encodedValue: 'foo',
  99. decodeKey: null,
  100. index: 0,
  101. value: 'foo'
  102. };
  103. const expectedStringArrayStorageItemData2: undefined = undefined;
  104. let stringArrayStorageItemData1: IStringArrayStorageItemData | undefined;
  105. let stringArrayStorageItemData2: IStringArrayStorageItemData | undefined;
  106. before(() => {
  107. stringArrayStorageAnalyzer = getStringArrayStorageAnalyzer({
  108. stringArrayThreshold: 1
  109. });
  110. const astTree: ESTree.Program = NodeFactory.programNode([
  111. NodeFactory.expressionStatementNode(literalNode1),
  112. NodeFactory.expressionStatementNode(literalNode2)
  113. ]);
  114. stringArrayStorageAnalyzer.analyze(astTree);
  115. stringArrayStorageItemData1 = stringArrayStorageAnalyzer.getItemDataForLiteralNode(literalNode1);
  116. stringArrayStorageItemData2 = stringArrayStorageAnalyzer.getItemDataForLiteralNode(literalNode2);
  117. });
  118. it('Variant #1: should return correct string array storage item data for literal node #1', () => {
  119. assert.deepEqual(stringArrayStorageItemData1, expectedStringArrayStorageItemData1);
  120. });
  121. it('Variant #2: should return correct string array storage item data for literal node #1', () => {
  122. assert.deepEqual(stringArrayStorageItemData2, expectedStringArrayStorageItemData2);
  123. });
  124. });
  125. describe('Analyzes of the AST tree with ignored nodes', () => {
  126. const literalNode1: ESTree.Literal = NodeFactory.literalNode('foo');
  127. const literalNode2: ESTree.Literal = NodeFactory.literalNode('bar');
  128. NodeMetadata.set(literalNode2, {ignoredNode: true});
  129. const expectedStringArrayStorageItemData1: IStringArrayStorageItemData = {
  130. encodedValue: 'foo',
  131. decodeKey: null,
  132. index: 0,
  133. value: 'foo'
  134. };
  135. const expectedStringArrayStorageItemData2: undefined = undefined;
  136. let stringArrayStorageItemData1: IStringArrayStorageItemData | undefined;
  137. let stringArrayStorageItemData2: IStringArrayStorageItemData | undefined;
  138. before(() => {
  139. stringArrayStorageAnalyzer = getStringArrayStorageAnalyzer({
  140. stringArrayThreshold: 1
  141. });
  142. const astTree: ESTree.Program = NodeFactory.programNode([
  143. NodeFactory.expressionStatementNode(literalNode1),
  144. NodeFactory.expressionStatementNode(literalNode2)
  145. ]);
  146. stringArrayStorageAnalyzer.analyze(astTree);
  147. stringArrayStorageItemData1 = stringArrayStorageAnalyzer.getItemDataForLiteralNode(literalNode1);
  148. stringArrayStorageItemData2 = stringArrayStorageAnalyzer.getItemDataForLiteralNode(literalNode2);
  149. });
  150. it('Variant #1: should return correct string array storage item data for literal node #1', () => {
  151. assert.deepEqual(stringArrayStorageItemData1, expectedStringArrayStorageItemData1);
  152. });
  153. it('Variant #2: should return correct string array storage item data for literal node #1', () => {
  154. assert.deepEqual(stringArrayStorageItemData2, expectedStringArrayStorageItemData2);
  155. });
  156. });
  157. describe('Analyzes of the AST tree string array threshold', () => {
  158. describe('Threshold value: 0', () => {
  159. const literalNode1: ESTree.Literal = NodeFactory.literalNode('foo');
  160. const literalNode2: ESTree.Literal = NodeFactory.literalNode('bar');
  161. const expectedStringArrayStorageItemData1: undefined = undefined;
  162. const expectedStringArrayStorageItemData2: undefined = undefined;
  163. let stringArrayStorageItemData1: IStringArrayStorageItemData | undefined;
  164. let stringArrayStorageItemData2: IStringArrayStorageItemData | undefined;
  165. before(() => {
  166. stringArrayStorageAnalyzer = getStringArrayStorageAnalyzer({
  167. stringArrayThreshold: 0
  168. });
  169. const astTree: ESTree.Program = NodeFactory.programNode([
  170. NodeFactory.expressionStatementNode(literalNode1),
  171. NodeFactory.expressionStatementNode(literalNode2)
  172. ]);
  173. stringArrayStorageAnalyzer.analyze(astTree);
  174. stringArrayStorageItemData1 = stringArrayStorageAnalyzer.getItemDataForLiteralNode(literalNode1);
  175. stringArrayStorageItemData2 = stringArrayStorageAnalyzer.getItemDataForLiteralNode(literalNode2);
  176. });
  177. it('Variant #1: should return correct string array storage item data for literal node #1', () => {
  178. assert.deepEqual(stringArrayStorageItemData1, expectedStringArrayStorageItemData1);
  179. });
  180. it('Variant #2: should return correct string array storage item data for literal node #1', () => {
  181. assert.deepEqual(stringArrayStorageItemData2, expectedStringArrayStorageItemData2);
  182. });
  183. });
  184. describe('Threshold value: 0.5', () => {
  185. const literalNode1: ESTree.Literal = NodeFactory.literalNode('foo');
  186. const literalNode2: ESTree.Literal = NodeFactory.literalNode('bar');
  187. const expectedStringArrayStorageItemData1: undefined = undefined;
  188. const expectedStringArrayStorageItemData2: IStringArrayStorageItemData = {
  189. encodedValue: 'bar',
  190. decodeKey: null,
  191. index: 0,
  192. value: 'bar'
  193. };
  194. let stringArrayStorageItemData1: IStringArrayStorageItemData | undefined;
  195. let stringArrayStorageItemData2: IStringArrayStorageItemData | undefined;
  196. before(() => {
  197. stringArrayStorageAnalyzer = getStringArrayStorageAnalyzer({
  198. stringArrayThreshold: 0.5
  199. });
  200. const astTree: ESTree.Program = NodeFactory.programNode([
  201. NodeFactory.expressionStatementNode(literalNode1),
  202. NodeFactory.expressionStatementNode(literalNode2)
  203. ]);
  204. stringArrayStorageAnalyzer.analyze(astTree);
  205. stringArrayStorageItemData1 = stringArrayStorageAnalyzer.getItemDataForLiteralNode(literalNode1);
  206. stringArrayStorageItemData2 = stringArrayStorageAnalyzer.getItemDataForLiteralNode(literalNode2);
  207. });
  208. it('Variant #1: should return correct string array storage item data for literal node #1', () => {
  209. assert.deepEqual(stringArrayStorageItemData1, expectedStringArrayStorageItemData1);
  210. });
  211. it('Variant #2: should return correct string array storage item data for literal node #1', () => {
  212. assert.deepEqual(stringArrayStorageItemData2, expectedStringArrayStorageItemData2);
  213. });
  214. });
  215. });
  216. });
  217. });