NodeUtils.spec.ts 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. import { IBlockStatementNode } from "../src/interfaces/nodes/IBlockStatementNode";
  2. import { IIdentifierNode } from "../src/interfaces/nodes/IIdentifierNode";
  3. import { ILiteralNode } from "../src/interfaces/nodes/ILiteralNode";
  4. import { IProgramNode } from "../src/interfaces/nodes/IProgramNode";
  5. import { NodeType } from "../src/enums/NodeType";
  6. import { NodeUtils } from '../src/NodeUtils';
  7. import {IFunctionDeclarationNode} from "../src/interfaces/nodes/IFunctionDeclarationNode";
  8. let assert: any = require('chai').assert;
  9. describe('NodeUtils', () => {
  10. describe('addXVerbatimPropertyToLiterals (node: INode): void', () => {
  11. let node: any;
  12. beforeEach(() => {
  13. node = {
  14. type: NodeType.Literal,
  15. value: 'string',
  16. raw: `'string'`
  17. };
  18. NodeUtils.addXVerbatimPropertyToLiterals(node)
  19. });
  20. it('should add `x-verbatim-property` to `Literal` node', () => {
  21. assert.deepEqual(node, {
  22. type: NodeType.Literal,
  23. value: 'string',
  24. raw: `'string'`,
  25. 'x-verbatim-property': `'string'`
  26. });
  27. });
  28. });
  29. describe('appendNode (blockScopeBody: INode[], node: INode): void', () => {
  30. let blockStatementNode: IBlockStatementNode,
  31. identifierNode: IIdentifierNode;
  32. beforeEach(() => {
  33. blockStatementNode = {
  34. type: NodeType.Literal,
  35. body: []
  36. };
  37. identifierNode = {
  38. type: NodeType.Identifier,
  39. name: 'identifier'
  40. };
  41. NodeUtils.appendNode(blockStatementNode.body, identifierNode)
  42. });
  43. it('should append given node to a `BlockStatement` node body', () => {
  44. assert.deepEqual(blockStatementNode, {
  45. type: NodeType.Literal,
  46. body: [identifierNode]
  47. });
  48. });
  49. });
  50. describe('getBlockScopeNodeByIndex (node: INode, index: number = 0): INode', () => {
  51. let blockStatementNode: IBlockStatementNode,
  52. identifierNode: IIdentifierNode,
  53. literalNode: ILiteralNode;
  54. beforeEach(() => {
  55. identifierNode = {
  56. type: NodeType.Identifier,
  57. name: 'identifier'
  58. };
  59. literalNode = {
  60. type: NodeType.Literal,
  61. value: 'string',
  62. raw: `'string'`,
  63. 'x-verbatim-property': `'string'`
  64. };
  65. blockStatementNode = {
  66. type: NodeType.BlockStatement,
  67. body: [
  68. identifierNode,
  69. literalNode
  70. ]
  71. };
  72. });
  73. it('should return block-scope node of given node by given index if node has block-scope', () => {
  74. assert.deepEqual(NodeUtils.getBlockScopeNodeByIndex(blockStatementNode), identifierNode);
  75. assert.deepEqual(NodeUtils.getBlockScopeNodeByIndex(blockStatementNode, 1), literalNode);
  76. });
  77. it('should return root node if index is out of boundaries', () => {
  78. assert.deepEqual(NodeUtils.getBlockScopeNodeByIndex(blockStatementNode, 2), blockStatementNode);
  79. });
  80. it('should return root node if node has not block-scope', () => {
  81. assert.deepEqual(NodeUtils.getBlockScopeNodeByIndex(identifierNode, 1), identifierNode);
  82. });
  83. });
  84. describe('getBlockScopeOfNode (node: INode, depth: number = 0): TBlockScopeNode', () => {
  85. let blockStatementNode: IBlockStatementNode,
  86. identifierNode: IIdentifierNode,
  87. functionDeclarationNode: IFunctionDeclarationNode,
  88. literalNode: ILiteralNode,
  89. programNode: IProgramNode;
  90. beforeEach(() => {
  91. identifierNode = {
  92. type: NodeType.Identifier,
  93. name: 'identifier',
  94. };
  95. literalNode = {
  96. type: NodeType.Literal,
  97. value: 'string',
  98. raw: `'string'`,
  99. 'x-verbatim-property': `'string'`
  100. };
  101. blockStatementNode = {
  102. type: NodeType.BlockStatement,
  103. body: [
  104. identifierNode,
  105. literalNode
  106. ]
  107. };
  108. functionDeclarationNode = {
  109. type: NodeType.FunctionDeclaration,
  110. id: {
  111. type: NodeType.Identifier,
  112. name: 'test'
  113. },
  114. params: [],
  115. body: blockStatementNode,
  116. generator: false,
  117. expression: false
  118. };
  119. programNode = {
  120. type: NodeType.Program,
  121. body: [functionDeclarationNode]
  122. };
  123. programNode['parentNode'] = programNode;
  124. functionDeclarationNode['parentNode'] = programNode;
  125. blockStatementNode['parentNode'] = functionDeclarationNode;
  126. identifierNode['parentNode'] = blockStatementNode;
  127. literalNode['parentNode'] = blockStatementNode;
  128. });
  129. it('should return block-scope node for given node', () => {
  130. assert.deepEqual(NodeUtils.getBlockScopeOfNode(identifierNode), blockStatementNode);
  131. assert.deepEqual(NodeUtils.getBlockScopeOfNode(identifierNode, 1), programNode);
  132. assert.deepEqual(NodeUtils.getBlockScopeOfNode(functionDeclarationNode), programNode);
  133. assert.deepEqual(NodeUtils.getBlockScopeOfNode(programNode), programNode);
  134. });
  135. });
  136. describe('insertNodeAtIndex (blockScopeBody: INode[], node: INode, index: number): void', () => {
  137. let blockStatementNode: IBlockStatementNode,
  138. expectedBlockStatementNode: IBlockStatementNode,
  139. identifierNode: IIdentifierNode,
  140. literalNode: ILiteralNode;
  141. beforeEach(() => {
  142. identifierNode = {
  143. type: NodeType.Identifier,
  144. name: 'identifier'
  145. };
  146. literalNode = {
  147. type: NodeType.Literal,
  148. value: 'string',
  149. raw: `'string'`,
  150. 'x-verbatim-property': `'string'`
  151. };
  152. blockStatementNode = {
  153. type: NodeType.BlockStatement,
  154. body: [
  155. identifierNode
  156. ]
  157. };
  158. expectedBlockStatementNode = Object.assign({}, blockStatementNode);
  159. expectedBlockStatementNode['body'].push(literalNode);
  160. NodeUtils.insertNodeAtIndex(blockStatementNode.body, literalNode, 1);
  161. });
  162. it('should insert given node in block-scope body at index', () => {
  163. assert.deepEqual(blockStatementNode, expectedBlockStatementNode);
  164. });
  165. });
  166. describe('parentize (node: INode): void', () => {
  167. let blockStatementNode: IBlockStatementNode,
  168. identifierNode: IIdentifierNode,
  169. literalNode: ILiteralNode,
  170. programNode: IProgramNode;
  171. beforeEach(() => {
  172. identifierNode = {
  173. type: NodeType.Identifier,
  174. name: 'identifier'
  175. };
  176. literalNode = {
  177. type: NodeType.Literal,
  178. value: 'string',
  179. raw: `'string'`,
  180. 'x-verbatim-property': `'string'`
  181. };
  182. blockStatementNode = {
  183. type: NodeType.BlockStatement,
  184. body: [
  185. identifierNode,
  186. literalNode
  187. ]
  188. };
  189. programNode = {
  190. type: NodeType.Program,
  191. body: [blockStatementNode]
  192. };
  193. NodeUtils.parentize(blockStatementNode);
  194. });
  195. it('should parentize given AST-tree', () => {
  196. assert.deepEqual(blockStatementNode['parentNode'], programNode);
  197. assert.deepEqual(identifierNode['parentNode'], blockStatementNode);
  198. assert.deepEqual(literalNode['parentNode'], blockStatementNode);
  199. });
  200. });
  201. describe('prependNode (blockScopeBody: INode[], node: INode): void', () => {
  202. let blockStatementNode: IBlockStatementNode,
  203. expectedBlockStatementNode: IBlockStatementNode,
  204. identifierNode: IIdentifierNode,
  205. literalNode: ILiteralNode;
  206. beforeEach(() => {
  207. identifierNode = {
  208. type: NodeType.Identifier,
  209. name: 'identifier'
  210. };
  211. literalNode = {
  212. type: NodeType.Literal,
  213. value: 'string',
  214. raw: `'string'`,
  215. 'x-verbatim-property': `'string'`
  216. };
  217. blockStatementNode = {
  218. type: NodeType.Literal,
  219. body: [identifierNode]
  220. };
  221. expectedBlockStatementNode = Object.assign({}, blockStatementNode);
  222. expectedBlockStatementNode['body'].unshift(literalNode);
  223. NodeUtils.prependNode(blockStatementNode.body, literalNode)
  224. });
  225. it('should prepend given node to a `BlockStatement` node body', () => {
  226. assert.deepEqual(blockStatementNode, expectedBlockStatementNode);
  227. });
  228. });
  229. });