NodeUtils.spec.ts 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  1. import * as ESTree from 'estree';
  2. import { assert } from 'chai';
  3. import { TStatement } from '../../../../src/types/node/TStatement';
  4. import { Nodes } from '../../../../src/node/Nodes';
  5. import { NodeUtils } from '../../../../src/node/NodeUtils';
  6. describe('NodeUtils', () => {
  7. describe('addXVerbatimPropertyToLiterals (node: ESTree.Node): void', () => {
  8. let literalNode: any,
  9. expectedLiteralNode: any;
  10. before(() => {
  11. literalNode = Nodes.getLiteralNode('value');
  12. delete literalNode['x-verbatim-property'];
  13. expectedLiteralNode = Nodes.getLiteralNode('value');
  14. NodeUtils.addXVerbatimPropertyToLiterals(literalNode);
  15. });
  16. it('should add `x-verbatim-property` to `Literal` node', () => {
  17. assert.deepEqual(literalNode, expectedLiteralNode);
  18. });
  19. });
  20. describe('clone <T extends ESTree.Node> (astTree: T): T', () => {
  21. describe('variant #1: simple AST-tree', () => {
  22. let programNode: ESTree.Program,
  23. expectedProgramNode: ESTree.Program;
  24. before(() => {
  25. // actual AST tree
  26. const expressionStatementNode1: ESTree.ExpressionStatement = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier'));
  27. const expressionStatementNode2: ESTree.ExpressionStatement = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier'));
  28. const ifStatementBlockStatementNode1: ESTree.BlockStatement = Nodes.getBlockStatementNode([
  29. expressionStatementNode1,
  30. expressionStatementNode2
  31. ]);
  32. const ifStatementNode1: ESTree.IfStatement = Nodes.getIfStatementNode(
  33. Nodes.getLiteralNode(true),
  34. ifStatementBlockStatementNode1
  35. );
  36. // expected AST tree
  37. const expressionStatementNode3: ESTree.ExpressionStatement = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier'));
  38. const expressionStatementNode4: ESTree.ExpressionStatement = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier'));
  39. const ifStatementBlockStatementNode2: ESTree.BlockStatement = Nodes.getBlockStatementNode([
  40. expressionStatementNode3,
  41. expressionStatementNode4
  42. ]);
  43. const ifStatementNode2: ESTree.IfStatement = Nodes.getIfStatementNode(
  44. Nodes.getLiteralNode(true),
  45. ifStatementBlockStatementNode2
  46. );
  47. programNode = NodeUtils.clone(
  48. Nodes.getProgramNode([
  49. ifStatementNode1
  50. ])
  51. );
  52. expectedProgramNode = NodeUtils.parentize(
  53. Nodes.getProgramNode([
  54. ifStatementNode2
  55. ])
  56. );
  57. });
  58. it('should clone given AST-tree', () => {
  59. assert.deepEqual(programNode, expectedProgramNode);
  60. });
  61. });
  62. describe('variant #2: array expression with `null` element', () => {
  63. let programNode: ESTree.Program,
  64. expectedProgramNode: ESTree.Program;
  65. before(() => {
  66. // actual AST tree
  67. const arrayExpressionNode: ESTree.ArrayExpression = Nodes.getArrayExpressionNode([
  68. Nodes.getLiteralNode(1),
  69. Nodes.getLiteralNode(2),
  70. <any>null,
  71. Nodes.getLiteralNode(4)
  72. ]);
  73. const expressionStatementNode: ESTree.ExpressionStatement = Nodes.getExpressionStatementNode(
  74. arrayExpressionNode
  75. );
  76. // expected AST tree
  77. const expectedArrayExpressionNode: ESTree.ArrayExpression = Nodes.getArrayExpressionNode([
  78. Nodes.getLiteralNode(1),
  79. Nodes.getLiteralNode(2),
  80. <any>null,
  81. Nodes.getLiteralNode(4)
  82. ]);
  83. const expectedExpressionStatementNode: ESTree.ExpressionStatement = Nodes.getExpressionStatementNode(
  84. expectedArrayExpressionNode
  85. );
  86. programNode = NodeUtils.clone(
  87. Nodes.getProgramNode([
  88. expressionStatementNode
  89. ])
  90. );
  91. expectedProgramNode = NodeUtils.parentize(
  92. Nodes.getProgramNode([
  93. expectedExpressionStatementNode
  94. ])
  95. );
  96. });
  97. it('should clone given AST-tree', () => {
  98. assert.deepEqual(programNode, expectedProgramNode);
  99. });
  100. });
  101. });
  102. describe('convertCodeToStructure (code: string): ESTree.Node[]', () => {
  103. let structure: TStatement[],
  104. expectedStructure: TStatement[];
  105. before(() => {
  106. const code: string = `
  107. var abc = 'cde';
  108. `;
  109. const identifierNode: ESTree.Identifier = Nodes.getIdentifierNode('abc');
  110. const literalNode: ESTree.Literal = Nodes.getLiteralNode('cde');
  111. const variableDeclaratorNode: ESTree.VariableDeclarator = Nodes.getVariableDeclaratorNode(identifierNode, literalNode);
  112. const variableDeclarationNode: ESTree.VariableDeclaration = Nodes.getVariableDeclarationNode([
  113. variableDeclaratorNode
  114. ]);
  115. const programNode: ESTree.Program = Nodes.getProgramNode([
  116. variableDeclarationNode
  117. ]);
  118. programNode.parentNode = programNode;
  119. variableDeclarationNode.parentNode = programNode;
  120. variableDeclaratorNode.parentNode = variableDeclarationNode;
  121. identifierNode.parentNode = variableDeclaratorNode;
  122. literalNode.parentNode = variableDeclaratorNode;
  123. structure = NodeUtils.convertCodeToStructure(code);
  124. expectedStructure = [variableDeclarationNode];
  125. });
  126. it('should convert code to `ESTree.Node[]` structure array', () => {
  127. assert.deepEqual(structure, expectedStructure);
  128. });
  129. });
  130. describe('convertStructureToCode (structure: ESTree.Node[]): string', () => {
  131. let structure: ESTree.Node[],
  132. expectedCode: string;
  133. before(() => {
  134. structure = [
  135. Nodes.getProgramNode([
  136. Nodes.getVariableDeclarationNode([
  137. Nodes.getVariableDeclaratorNode(
  138. Nodes.getIdentifierNode('abc'),
  139. Nodes.getLiteralNode('cde')
  140. )
  141. ])
  142. ])
  143. ];
  144. expectedCode = 'var abc = \'cde\';';
  145. });
  146. it('should convert `ESTree.Node[]` structure to source code', () => {
  147. assert.deepEqual(NodeUtils.convertStructureToCode(structure), expectedCode);
  148. });
  149. });
  150. describe('getBlockStatementNodeByIndex (node: ESTree.Node, index: number = 0): ESTree.Node', () => {
  151. let blockStatementNode: ESTree.BlockStatement,
  152. expressionStatementNode1: ESTree.ExpressionStatement,
  153. expressionStatementNode2: ESTree.ExpressionStatement;
  154. beforeEach(() => {
  155. expressionStatementNode1 = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier'));
  156. expressionStatementNode2 = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier'));
  157. blockStatementNode = Nodes.getBlockStatementNode([
  158. expressionStatementNode1,
  159. expressionStatementNode2
  160. ]);
  161. });
  162. it('should return block-statement child node of given node if that node has block-statement', () => {
  163. assert.deepEqual(NodeUtils.getBlockStatementNodeByIndex(blockStatementNode), expressionStatementNode1);
  164. });
  165. it('should return block-statement child node of given node with index `1` if that node has block-statement', () => {
  166. assert.deepEqual(NodeUtils.getBlockStatementNodeByIndex(blockStatementNode, 1), expressionStatementNode2);
  167. });
  168. it('should throw a `ReferenceError` if index is out of boundaries', () => {
  169. assert.throws(() => NodeUtils.getBlockStatementNodeByIndex(blockStatementNode, 2), ReferenceError);
  170. });
  171. it('should throw a `TypeError` if node have no a block-statement', () => {
  172. assert.throws(() => NodeUtils.getBlockStatementNodeByIndex(expressionStatementNode1, 1), TypeError);
  173. });
  174. });
  175. describe('getBlockScopesOfNode (node: ESTree.Node, blockScopes: TNodeWithBlockStatement[] = []): TNodeWithBlockStatement[]', () => {
  176. let functionDeclarationBlockStatementNode: ESTree.BlockStatement,
  177. ifStatementBlockStatementNode1: ESTree.BlockStatement,
  178. ifStatementBlockStatementNode2: ESTree.BlockStatement,
  179. ifStatementNode1: ESTree.IfStatement,
  180. ifStatementNode2: ESTree.IfStatement,
  181. expressionStatementNode3: ESTree.ExpressionStatement,
  182. expressionStatementNode2: ESTree.ExpressionStatement,
  183. expressionStatementNode1: ESTree.ExpressionStatement,
  184. functionDeclarationNode: ESTree.FunctionDeclaration,
  185. programNode: ESTree.Program;
  186. before(() => {
  187. expressionStatementNode1 = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier'));
  188. expressionStatementNode2 = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier'));
  189. expressionStatementNode3 = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier'));
  190. ifStatementBlockStatementNode2 = Nodes.getBlockStatementNode([
  191. expressionStatementNode2,
  192. expressionStatementNode3
  193. ]);
  194. ifStatementNode2 = Nodes.getIfStatementNode(
  195. Nodes.getLiteralNode(true),
  196. ifStatementBlockStatementNode2
  197. );
  198. ifStatementBlockStatementNode1 = Nodes.getBlockStatementNode([
  199. ifStatementNode2
  200. ]);
  201. ifStatementNode1 = Nodes.getIfStatementNode(
  202. Nodes.getLiteralNode(true),
  203. ifStatementBlockStatementNode1
  204. );
  205. functionDeclarationBlockStatementNode = Nodes.getBlockStatementNode([
  206. expressionStatementNode1,
  207. ifStatementNode1
  208. ]);
  209. functionDeclarationNode = Nodes.getFunctionDeclarationNode('test', [], functionDeclarationBlockStatementNode);
  210. programNode = Nodes.getProgramNode([
  211. functionDeclarationNode
  212. ]);
  213. programNode.parentNode = programNode;
  214. functionDeclarationNode.parentNode = programNode;
  215. functionDeclarationBlockStatementNode.parentNode = functionDeclarationNode;
  216. expressionStatementNode1.parentNode = functionDeclarationBlockStatementNode;
  217. ifStatementNode1.parentNode = functionDeclarationBlockStatementNode;
  218. ifStatementBlockStatementNode1.parentNode = ifStatementNode1;
  219. ifStatementNode2.parentNode = ifStatementBlockStatementNode1;
  220. ifStatementBlockStatementNode2.parentNode = ifStatementNode2;
  221. expressionStatementNode3.parentNode = ifStatementBlockStatementNode2;
  222. });
  223. it('should return block-scope node for `program` node child', () => {
  224. assert.deepEqual(NodeUtils.getBlockScopesOfNode(programNode)[0], programNode);
  225. });
  226. it('should return block-scope node for `functionDeclaration` node child node #1', () => {
  227. assert.deepEqual(NodeUtils.getBlockScopesOfNode(functionDeclarationNode)[0], programNode);
  228. });
  229. it('should return block-scope node for `functionDeclaration blockStatement` node child node #1', () => {
  230. assert.deepEqual(NodeUtils.getBlockScopesOfNode(functionDeclarationBlockStatementNode)[0], programNode);
  231. });
  232. it('should return block-scope node for `expressionStatement` node #1 child node #1', () => {
  233. assert.deepEqual(NodeUtils.getBlockScopesOfNode(expressionStatementNode1)[0], functionDeclarationBlockStatementNode);
  234. });
  235. it('should return block-scope node for `expressionStatement` node #1 child node #2', () => {
  236. assert.deepEqual(NodeUtils.getBlockScopesOfNode(expressionStatementNode1)[1], programNode);
  237. });
  238. it('should return block-scope node for `ifStatement` node child node #1', () => {
  239. assert.deepEqual(NodeUtils.getBlockScopesOfNode(ifStatementNode1)[0], functionDeclarationBlockStatementNode);
  240. });
  241. it('should return block-scope node for `ifStatement` node child node #2', () => {
  242. assert.deepEqual(NodeUtils.getBlockScopesOfNode(ifStatementNode1)[1], programNode);
  243. });
  244. it('should return block-scope node for `ifStatement blockStatement` node #1 child node #1', () => {
  245. assert.deepEqual(NodeUtils.getBlockScopesOfNode(ifStatementBlockStatementNode1)[0], functionDeclarationBlockStatementNode);
  246. });
  247. it('should return block-scope node for `ifStatement blockStatement` node #1 child node #2', () => {
  248. assert.deepEqual(NodeUtils.getBlockScopesOfNode(ifStatementBlockStatementNode1)[1], programNode);
  249. });
  250. it('should return block-scope node for `ifStatement blockStatement` node #2 child node #1', () => {
  251. assert.deepEqual(NodeUtils.getBlockScopesOfNode(ifStatementBlockStatementNode2)[0], functionDeclarationBlockStatementNode);
  252. });
  253. it('should return block-scope node for `ifStatement blockStatement` node #1 child node #2', () => {
  254. assert.deepEqual(NodeUtils.getBlockScopesOfNode(ifStatementBlockStatementNode2)[1], programNode);
  255. });
  256. it('should return block-scope node for `expressionStatement` node #3 child node #1', () => {
  257. assert.deepEqual(NodeUtils.getBlockScopesOfNode(expressionStatementNode3)[0], functionDeclarationBlockStatementNode);
  258. });
  259. it('should return block-scope node for `expressionStatement` node #3 child node #2', () => {
  260. assert.deepEqual(NodeUtils.getBlockScopesOfNode(expressionStatementNode3)[1], programNode);
  261. });
  262. it('should throw a `ReferenceError` if node has no `parentNode` property', () => {
  263. assert.throws(() => NodeUtils.getBlockScopesOfNode(expressionStatementNode2)[0], ReferenceError);
  264. });
  265. });
  266. describe('getNodeBlockScopeDepth (node: ESTree.Node, depth: number = 0): number', () => {
  267. let functionDeclarationBlockStatementNode1: ESTree.BlockStatement,
  268. functionDeclarationBlockStatementNode2: ESTree.BlockStatement,
  269. ifStatementBlockStatementNode1: ESTree.BlockStatement,
  270. ifStatementBlockStatementNode2: ESTree.BlockStatement,
  271. ifStatementNode1: ESTree.IfStatement,
  272. ifStatementNode2: ESTree.IfStatement,
  273. expressionStatementNode1: ESTree.ExpressionStatement,
  274. expressionStatementNode2: ESTree.ExpressionStatement,
  275. expressionStatementNode3: ESTree.ExpressionStatement,
  276. functionDeclarationNode1: ESTree.FunctionDeclaration,
  277. functionDeclarationNode2: ESTree.FunctionDeclaration,
  278. programNode: ESTree.Program;
  279. before(() => {
  280. expressionStatementNode1 = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier'));
  281. expressionStatementNode2 = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier'));
  282. expressionStatementNode3 = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier'));
  283. ifStatementBlockStatementNode2 = Nodes.getBlockStatementNode([
  284. expressionStatementNode3
  285. ]);
  286. ifStatementNode2 = Nodes.getIfStatementNode(
  287. Nodes.getLiteralNode(true),
  288. ifStatementBlockStatementNode2
  289. );
  290. functionDeclarationBlockStatementNode2 = Nodes.getBlockStatementNode([
  291. ifStatementNode2,
  292. expressionStatementNode2
  293. ]);
  294. functionDeclarationNode2 = Nodes.getFunctionDeclarationNode('test', [], functionDeclarationBlockStatementNode2);
  295. ifStatementBlockStatementNode1 = Nodes.getBlockStatementNode([
  296. functionDeclarationNode2
  297. ]);
  298. ifStatementNode1 = Nodes.getIfStatementNode(
  299. Nodes.getLiteralNode(true),
  300. ifStatementBlockStatementNode1
  301. );
  302. functionDeclarationBlockStatementNode1 = Nodes.getBlockStatementNode([
  303. expressionStatementNode1,
  304. ifStatementNode1
  305. ]);
  306. functionDeclarationNode1 = Nodes.getFunctionDeclarationNode('test', [], functionDeclarationBlockStatementNode1);
  307. programNode = Nodes.getProgramNode([
  308. functionDeclarationNode1
  309. ]);
  310. programNode.parentNode = programNode;
  311. functionDeclarationNode1.parentNode = programNode;
  312. functionDeclarationBlockStatementNode1.parentNode = functionDeclarationNode1;
  313. expressionStatementNode1.parentNode = functionDeclarationBlockStatementNode1;
  314. ifStatementNode1.parentNode = functionDeclarationBlockStatementNode1;
  315. ifStatementBlockStatementNode1.parentNode = ifStatementNode1;
  316. functionDeclarationNode2.parentNode = ifStatementBlockStatementNode1;
  317. functionDeclarationBlockStatementNode2.parentNode = functionDeclarationNode2;
  318. expressionStatementNode2.parentNode = functionDeclarationBlockStatementNode2;
  319. ifStatementNode2.parentNode = functionDeclarationBlockStatementNode2;
  320. ifStatementBlockStatementNode2.parentNode = ifStatementNode2;
  321. });
  322. it('should return block-scope depth for `program` node', () => {
  323. assert.deepEqual(NodeUtils.getNodeBlockScopeDepth(programNode), 0);
  324. });
  325. it('should return block-scope depth for `functionDeclaration` node #1', () => {
  326. assert.deepEqual(NodeUtils.getNodeBlockScopeDepth(functionDeclarationNode1), 0);
  327. });
  328. it('should return block-scope depth for `functionDeclaration blockStatement` node #1', () => {
  329. assert.deepEqual(NodeUtils.getNodeBlockScopeDepth(functionDeclarationBlockStatementNode1), 1);
  330. });
  331. it('should return block-scope depth for `expressionStatement` node #1', () => {
  332. assert.deepEqual(NodeUtils.getNodeBlockScopeDepth(expressionStatementNode1), 1);
  333. });
  334. it('should return block-scope depth for `ifStatement` node #1', () => {
  335. assert.deepEqual(NodeUtils.getNodeBlockScopeDepth(ifStatementNode1), 1);
  336. });
  337. it('should return block-scope depth for `ifStatement blockStatement` node #1', () => {
  338. assert.deepEqual(NodeUtils.getNodeBlockScopeDepth(ifStatementBlockStatementNode1), 1);
  339. });
  340. it('should return block-scope depth for `functionDeclaration` node #2', () => {
  341. assert.deepEqual(NodeUtils.getNodeBlockScopeDepth(functionDeclarationNode2), 1);
  342. });
  343. it('should return block-scope depth for `functionDeclaration blockStatement` node #2', () => {
  344. assert.deepEqual(NodeUtils.getNodeBlockScopeDepth(functionDeclarationBlockStatementNode2), 2);
  345. });
  346. it('should return block-scope depth for `expressionStatement` node #2', () => {
  347. assert.deepEqual(NodeUtils.getNodeBlockScopeDepth(expressionStatementNode2), 2);
  348. });
  349. it('should return block-scope depth for `ifStatement` node #2', () => {
  350. assert.deepEqual(NodeUtils.getNodeBlockScopeDepth(ifStatementNode2), 2);
  351. });
  352. it('should return block-scope depth for `ifStatement blockStatement` node #2', () => {
  353. assert.deepEqual(NodeUtils.getNodeBlockScopeDepth(ifStatementBlockStatementNode2), 2);
  354. });
  355. it('should throw a `ReferenceError` if node has no `parentNode` property', () => {
  356. assert.throws(() => NodeUtils.getNodeBlockScopeDepth(expressionStatementNode3), ReferenceError);
  357. });
  358. });
  359. describe('getUnaryExpressionArgumentNode (unaryExpressionNode: ESTree.UnaryExpression): ESTree.Node', () => {
  360. let expectedNode: ESTree.Literal,
  361. unaryExpressionArgumentNode: ESTree.Node;
  362. before(() => {
  363. const literalNode: ESTree.Literal = Nodes.getLiteralNode('test');
  364. const unaryExpressionNode2: ESTree.UnaryExpression = Nodes.getUnaryExpressionNode('!', literalNode);
  365. const unaryExpressionNode1: ESTree.UnaryExpression = Nodes.getUnaryExpressionNode('!', unaryExpressionNode2);
  366. const expressionStatementNode: ESTree.ExpressionStatement = Nodes.getExpressionStatementNode(unaryExpressionNode1);
  367. const programNode: ESTree.Program = Nodes.getProgramNode([
  368. expressionStatementNode
  369. ]);
  370. programNode.parentNode = programNode;
  371. expressionStatementNode.parentNode = programNode;
  372. unaryExpressionNode1.parentNode = expressionStatementNode;
  373. unaryExpressionNode2.parentNode = unaryExpressionNode1;
  374. literalNode.parentNode = unaryExpressionNode2;
  375. unaryExpressionArgumentNode = NodeUtils.getUnaryExpressionArgumentNode(unaryExpressionNode1);
  376. expectedNode = literalNode;
  377. });
  378. it('should return unary expression argument node', () => {
  379. assert.deepEqual(unaryExpressionArgumentNode, expectedNode);
  380. });
  381. });
  382. describe('parentize <T extends ESTree.Node> (astTree: T): T', () => {
  383. let ifStatementNode: ESTree.IfStatement,
  384. ifStatementBlockStatementNode: ESTree.BlockStatement,
  385. expressionStatementNode1: ESTree.ExpressionStatement,
  386. expressionStatementNode2: ESTree.ExpressionStatement,
  387. programNode: ESTree.Program;
  388. beforeEach(() => {
  389. expressionStatementNode1 = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier'));
  390. expressionStatementNode2 = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier'));
  391. ifStatementBlockStatementNode = Nodes.getBlockStatementNode([
  392. expressionStatementNode1,
  393. expressionStatementNode2
  394. ]);
  395. ifStatementNode = Nodes.getIfStatementNode(
  396. Nodes.getLiteralNode(true),
  397. ifStatementBlockStatementNode
  398. );
  399. });
  400. describe('parentize AST-tree with `ProgramNode` as root node', () => {
  401. beforeEach(() => {
  402. programNode = Nodes.getProgramNode([
  403. ifStatementNode
  404. ]);
  405. programNode = NodeUtils.parentize(programNode);
  406. });
  407. it('should parentize `program` node with `ProgramNode` as root node', () => {
  408. assert.deepEqual(programNode.parentNode, programNode);
  409. });
  410. it('should parentize `ifStatement` node with `ProgramNode` as root node', () => {
  411. assert.deepEqual(ifStatementNode.parentNode, programNode);
  412. });
  413. it('should parentize `ifStatement blockStatement` node with `ProgramNode` as root node', () => {
  414. assert.deepEqual(ifStatementBlockStatementNode.parentNode, ifStatementNode);
  415. });
  416. it('should parentize `expressionStatement` node #1 with `ProgramNode` as root node', () => {
  417. assert.deepEqual(expressionStatementNode1.parentNode, ifStatementBlockStatementNode);
  418. });
  419. it('should parentize `expressionStatement` node #2 with `ProgramNode` as root node', () => {
  420. assert.deepEqual(expressionStatementNode2.parentNode, ifStatementBlockStatementNode);
  421. });
  422. });
  423. describe('parentize AST-tree', () => {
  424. beforeEach(() => {
  425. ifStatementNode = NodeUtils.parentize(ifStatementNode);
  426. });
  427. it('should parentize `ifStatement` node', () => {
  428. assert.deepEqual(ifStatementNode.parentNode, ifStatementNode);
  429. });
  430. it('should parentize `ifStatement blockStatement` node', () => {
  431. assert.deepEqual(ifStatementBlockStatementNode.parentNode, ifStatementNode);
  432. });
  433. it('should parentize `expressionStatement` node #1', () => {
  434. assert.deepEqual(expressionStatementNode1.parentNode, ifStatementBlockStatementNode);
  435. });
  436. it('should parentize `expressionStatement` node #2', () => {
  437. assert.deepEqual(expressionStatementNode2.parentNode, ifStatementBlockStatementNode);
  438. });
  439. });
  440. });
  441. });