StringArrayStorageAnalyzer.spec.ts 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  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. /**
  158. * This test covers rare case when with random value inside `shouldAddValueToStringArray` was `0`
  159. * that trigger positive check for method.
  160. *
  161. * As fix i added check of `this.options.stringArray` option value
  162. */
  163. describe('Analyzes of the AST tree with disabled string array', () => {
  164. const literalNode1: ESTree.Literal = NodeFactory.literalNode('foo');
  165. const literalNode2: ESTree.Literal = NodeFactory.literalNode('bar');
  166. const expectedStringArrayStorageItemData1: undefined = undefined;
  167. const expectedStringArrayStorageItemData2: undefined = undefined;
  168. let stringArrayStorageItemData1: IStringArrayStorageItemData | undefined;
  169. let stringArrayStorageItemData2: IStringArrayStorageItemData | undefined;
  170. before(() => {
  171. stringArrayStorageAnalyzer = getStringArrayStorageAnalyzer({
  172. stringArray: false,
  173. stringArrayThreshold: 1
  174. });
  175. (<any>stringArrayStorageAnalyzer).options.stringArrayThreshold = 1;
  176. const astTree: ESTree.Program = NodeFactory.programNode([
  177. NodeFactory.expressionStatementNode(literalNode1),
  178. NodeFactory.expressionStatementNode(literalNode2)
  179. ]);
  180. stringArrayStorageAnalyzer.analyze(astTree);
  181. stringArrayStorageItemData1 = stringArrayStorageAnalyzer.getItemDataForLiteralNode(literalNode1);
  182. stringArrayStorageItemData2 = stringArrayStorageAnalyzer.getItemDataForLiteralNode(literalNode2);
  183. });
  184. it('Variant #1: should return correct string array storage item data for literal node #1', () => {
  185. assert.deepEqual(stringArrayStorageItemData1, expectedStringArrayStorageItemData1);
  186. });
  187. it('Variant #2: should return correct string array storage item data for literal node #1', () => {
  188. assert.deepEqual(stringArrayStorageItemData2, expectedStringArrayStorageItemData2);
  189. });
  190. });
  191. describe('Analyzes of the AST tree with string array threshold', () => {
  192. describe('Threshold value: 0', () => {
  193. const literalNode1: ESTree.Literal = NodeFactory.literalNode('foo');
  194. const literalNode2: ESTree.Literal = NodeFactory.literalNode('bar');
  195. const expectedStringArrayStorageItemData1: undefined = undefined;
  196. const expectedStringArrayStorageItemData2: undefined = undefined;
  197. let stringArrayStorageItemData1: IStringArrayStorageItemData | undefined;
  198. let stringArrayStorageItemData2: IStringArrayStorageItemData | undefined;
  199. before(() => {
  200. stringArrayStorageAnalyzer = getStringArrayStorageAnalyzer({
  201. stringArrayThreshold: 0
  202. });
  203. const astTree: ESTree.Program = NodeFactory.programNode([
  204. NodeFactory.expressionStatementNode(literalNode1),
  205. NodeFactory.expressionStatementNode(literalNode2)
  206. ]);
  207. stringArrayStorageAnalyzer.analyze(astTree);
  208. stringArrayStorageItemData1 = stringArrayStorageAnalyzer.getItemDataForLiteralNode(literalNode1);
  209. stringArrayStorageItemData2 = stringArrayStorageAnalyzer.getItemDataForLiteralNode(literalNode2);
  210. });
  211. it('Variant #1: should return correct string array storage item data for literal node #1', () => {
  212. assert.deepEqual(stringArrayStorageItemData1, expectedStringArrayStorageItemData1);
  213. });
  214. it('Variant #2: should return correct string array storage item data for literal node #1', () => {
  215. assert.deepEqual(stringArrayStorageItemData2, expectedStringArrayStorageItemData2);
  216. });
  217. });
  218. describe('Threshold value: 0.5', () => {
  219. const literalNode1: ESTree.Literal = NodeFactory.literalNode('foo');
  220. const literalNode2: ESTree.Literal = NodeFactory.literalNode('bar');
  221. const expectedStringArrayStorageItemData1: undefined = undefined;
  222. const expectedStringArrayStorageItemData2: IStringArrayStorageItemData = {
  223. encodedValue: 'bar',
  224. decodeKey: null,
  225. index: 0,
  226. value: 'bar'
  227. };
  228. let stringArrayStorageItemData1: IStringArrayStorageItemData | undefined;
  229. let stringArrayStorageItemData2: IStringArrayStorageItemData | undefined;
  230. before(() => {
  231. stringArrayStorageAnalyzer = getStringArrayStorageAnalyzer({
  232. stringArrayThreshold: 0.5,
  233. seed: 1
  234. });
  235. const astTree: ESTree.Program = NodeFactory.programNode([
  236. NodeFactory.expressionStatementNode(literalNode1),
  237. NodeFactory.expressionStatementNode(literalNode2)
  238. ]);
  239. stringArrayStorageAnalyzer.analyze(astTree);
  240. stringArrayStorageItemData1 = stringArrayStorageAnalyzer.getItemDataForLiteralNode(literalNode1);
  241. stringArrayStorageItemData2 = stringArrayStorageAnalyzer.getItemDataForLiteralNode(literalNode2);
  242. });
  243. it('Variant #1: should return correct string array storage item data for literal node #1', () => {
  244. assert.deepEqual(stringArrayStorageItemData1, expectedStringArrayStorageItemData1);
  245. });
  246. it('Variant #2: should return correct string array storage item data for literal node #2', () => {
  247. assert.deepEqual(stringArrayStorageItemData2, expectedStringArrayStorageItemData2);
  248. });
  249. });
  250. });
  251. });
  252. });