NodeUtils.spec.ts 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578
  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: ESTree.Literal,
  9. expectedLiteralNode: ESTree.Literal;
  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('getBlockScopesOfNode (node: ESTree.Node, blockScopes: TNodeWithBlockScope[] = []): TNodeWithBlockScope[]', () => {
  151. let functionDeclarationBlockStatementNode: ESTree.BlockStatement,
  152. ifStatementBlockStatementNode1: ESTree.BlockStatement,
  153. ifStatementBlockStatementNode2: ESTree.BlockStatement,
  154. ifStatementNode1: ESTree.IfStatement,
  155. ifStatementNode2: ESTree.IfStatement,
  156. expressionStatementNode3: ESTree.ExpressionStatement,
  157. expressionStatementNode2: ESTree.ExpressionStatement,
  158. expressionStatementNode1: ESTree.ExpressionStatement,
  159. functionDeclarationNode: ESTree.FunctionDeclaration,
  160. programNode: ESTree.Program;
  161. before(() => {
  162. expressionStatementNode1 = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier'));
  163. expressionStatementNode2 = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier'));
  164. expressionStatementNode3 = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier'));
  165. ifStatementBlockStatementNode2 = Nodes.getBlockStatementNode([
  166. expressionStatementNode2,
  167. expressionStatementNode3
  168. ]);
  169. ifStatementNode2 = Nodes.getIfStatementNode(
  170. Nodes.getLiteralNode(true),
  171. ifStatementBlockStatementNode2
  172. );
  173. ifStatementBlockStatementNode1 = Nodes.getBlockStatementNode([
  174. ifStatementNode2
  175. ]);
  176. ifStatementNode1 = Nodes.getIfStatementNode(
  177. Nodes.getLiteralNode(true),
  178. ifStatementBlockStatementNode1
  179. );
  180. functionDeclarationBlockStatementNode = Nodes.getBlockStatementNode([
  181. expressionStatementNode1,
  182. ifStatementNode1
  183. ]);
  184. functionDeclarationNode = Nodes.getFunctionDeclarationNode('test', [], functionDeclarationBlockStatementNode);
  185. programNode = Nodes.getProgramNode([
  186. functionDeclarationNode
  187. ]);
  188. programNode.parentNode = programNode;
  189. functionDeclarationNode.parentNode = programNode;
  190. functionDeclarationBlockStatementNode.parentNode = functionDeclarationNode;
  191. expressionStatementNode1.parentNode = functionDeclarationBlockStatementNode;
  192. ifStatementNode1.parentNode = functionDeclarationBlockStatementNode;
  193. ifStatementBlockStatementNode1.parentNode = ifStatementNode1;
  194. ifStatementNode2.parentNode = ifStatementBlockStatementNode1;
  195. ifStatementBlockStatementNode2.parentNode = ifStatementNode2;
  196. expressionStatementNode3.parentNode = ifStatementBlockStatementNode2;
  197. });
  198. it('should return block-scope node for `program` node child', () => {
  199. assert.deepEqual(NodeUtils.getBlockScopesOfNode(programNode)[0], programNode);
  200. });
  201. it('should return block-scope node for `functionDeclaration` node child node #1', () => {
  202. assert.deepEqual(NodeUtils.getBlockScopesOfNode(functionDeclarationNode)[0], programNode);
  203. });
  204. it('should return block-scope node for `functionDeclaration blockStatement` node child node #1', () => {
  205. assert.deepEqual(NodeUtils.getBlockScopesOfNode(functionDeclarationBlockStatementNode)[0], programNode);
  206. });
  207. it('should return block-scope node for `expressionStatement` node #1 child node #1', () => {
  208. assert.deepEqual(NodeUtils.getBlockScopesOfNode(expressionStatementNode1)[0], functionDeclarationBlockStatementNode);
  209. });
  210. it('should return block-scope node for `expressionStatement` node #1 child node #2', () => {
  211. assert.deepEqual(NodeUtils.getBlockScopesOfNode(expressionStatementNode1)[1], programNode);
  212. });
  213. it('should return block-scope node for `ifStatement` node child node #1', () => {
  214. assert.deepEqual(NodeUtils.getBlockScopesOfNode(ifStatementNode1)[0], functionDeclarationBlockStatementNode);
  215. });
  216. it('should return block-scope node for `ifStatement` node child node #2', () => {
  217. assert.deepEqual(NodeUtils.getBlockScopesOfNode(ifStatementNode1)[1], programNode);
  218. });
  219. it('should return block-scope node for `ifStatement blockStatement` node #1 child node #1', () => {
  220. assert.deepEqual(NodeUtils.getBlockScopesOfNode(ifStatementBlockStatementNode1)[0], functionDeclarationBlockStatementNode);
  221. });
  222. it('should return block-scope node for `ifStatement blockStatement` node #1 child node #2', () => {
  223. assert.deepEqual(NodeUtils.getBlockScopesOfNode(ifStatementBlockStatementNode1)[1], programNode);
  224. });
  225. it('should return block-scope node for `ifStatement blockStatement` node #2 child node #1', () => {
  226. assert.deepEqual(NodeUtils.getBlockScopesOfNode(ifStatementBlockStatementNode2)[0], functionDeclarationBlockStatementNode);
  227. });
  228. it('should return block-scope node for `ifStatement blockStatement` node #1 child node #2', () => {
  229. assert.deepEqual(NodeUtils.getBlockScopesOfNode(ifStatementBlockStatementNode2)[1], programNode);
  230. });
  231. it('should return block-scope node for `expressionStatement` node #3 child node #1', () => {
  232. assert.deepEqual(NodeUtils.getBlockScopesOfNode(expressionStatementNode3)[0], functionDeclarationBlockStatementNode);
  233. });
  234. it('should return block-scope node for `expressionStatement` node #3 child node #2', () => {
  235. assert.deepEqual(NodeUtils.getBlockScopesOfNode(expressionStatementNode3)[1], programNode);
  236. });
  237. it('should throw a `ReferenceError` if node has no `parentNode` property', () => {
  238. assert.throws(() => NodeUtils.getBlockScopesOfNode(expressionStatementNode2)[0], ReferenceError);
  239. });
  240. });
  241. describe('getScopeOfNode (node: ESTree.Node): TNodeWithScope | null', () => {
  242. let functionDeclarationBlockStatementNode: ESTree.BlockStatement,
  243. ifStatementBlockStatementNode1: ESTree.BlockStatement,
  244. ifStatementBlockStatementNode2: ESTree.BlockStatement,
  245. ifStatementBlockStatementNode3: ESTree.BlockStatement,
  246. ifStatementNode1: ESTree.IfStatement,
  247. ifStatementNode2: ESTree.IfStatement,
  248. ifStatementNode3: ESTree.IfStatement,
  249. switchCaseNode: ESTree.SwitchCase,
  250. switchStatementNode: ESTree.SwitchStatement,
  251. expressionStatementNode3: ESTree.ExpressionStatement,
  252. expressionStatementNode2: ESTree.ExpressionStatement,
  253. expressionStatementNode1: ESTree.ExpressionStatement,
  254. functionDeclarationNode: ESTree.FunctionDeclaration,
  255. programNode: ESTree.Program;
  256. before(() => {
  257. expressionStatementNode1 = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier'));
  258. expressionStatementNode2 = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier'));
  259. expressionStatementNode3 = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier'));
  260. ifStatementBlockStatementNode3 = Nodes.getBlockStatementNode([
  261. expressionStatementNode2,
  262. expressionStatementNode3
  263. ]);
  264. ifStatementNode3 = Nodes.getIfStatementNode(
  265. Nodes.getLiteralNode(true),
  266. ifStatementBlockStatementNode3
  267. );
  268. ifStatementBlockStatementNode2 = Nodes.getBlockStatementNode();
  269. ifStatementBlockStatementNode1 = Nodes.getBlockStatementNode([
  270. ifStatementNode3
  271. ]);
  272. ifStatementNode2 = Nodes.getIfStatementNode(
  273. Nodes.getLiteralNode(true),
  274. ifStatementBlockStatementNode2
  275. );
  276. ifStatementNode1 = Nodes.getIfStatementNode(
  277. Nodes.getLiteralNode(true),
  278. ifStatementBlockStatementNode1
  279. );
  280. switchCaseNode = Nodes.getSwitchCaseNode(
  281. Nodes.getLiteralNode(1),
  282. [
  283. ifStatementNode2
  284. ]
  285. );
  286. switchStatementNode = Nodes.getSwitchStatementNode(
  287. Nodes.getLiteralNode(1),
  288. [
  289. switchCaseNode
  290. ]
  291. );
  292. functionDeclarationBlockStatementNode = Nodes.getBlockStatementNode([
  293. expressionStatementNode1,
  294. ifStatementNode1,
  295. switchStatementNode
  296. ]);
  297. functionDeclarationNode = Nodes.getFunctionDeclarationNode('test', [], functionDeclarationBlockStatementNode);
  298. programNode = Nodes.getProgramNode([
  299. functionDeclarationNode
  300. ]);
  301. programNode.parentNode = programNode;
  302. functionDeclarationNode.parentNode = programNode;
  303. functionDeclarationBlockStatementNode.parentNode = functionDeclarationNode;
  304. expressionStatementNode1.parentNode = functionDeclarationBlockStatementNode;
  305. ifStatementNode1.parentNode = functionDeclarationBlockStatementNode;
  306. ifStatementBlockStatementNode1.parentNode = ifStatementNode1;
  307. switchStatementNode.parentNode = functionDeclarationBlockStatementNode;
  308. switchCaseNode.parentNode = switchStatementNode;
  309. ifStatementNode2.parentNode = switchCaseNode;
  310. ifStatementBlockStatementNode2.parentNode = ifStatementNode2;
  311. ifStatementNode3.parentNode = ifStatementBlockStatementNode1;
  312. ifStatementBlockStatementNode3.parentNode = ifStatementNode3;
  313. expressionStatementNode3.parentNode = ifStatementBlockStatementNode3;
  314. });
  315. it('should return scope node for `program` node child', () => {
  316. assert.deepEqual(NodeUtils.getScopeOfNode(programNode), programNode);
  317. });
  318. it('should return scope node for `functionDeclaration` node child node #1', () => {
  319. assert.deepEqual(NodeUtils.getScopeOfNode(functionDeclarationNode), programNode);
  320. });
  321. it('should return scope node for `functionDeclaration blockStatement` node child node #1', () => {
  322. assert.deepEqual(NodeUtils.getScopeOfNode(functionDeclarationBlockStatementNode), programNode);
  323. });
  324. it('should return scope node for `expressionStatement` node #1 child node', () => {
  325. assert.deepEqual(NodeUtils.getScopeOfNode(expressionStatementNode1), functionDeclarationBlockStatementNode);
  326. });
  327. it('should return scope node for `ifStatement` node #1 child node', () => {
  328. assert.deepEqual(NodeUtils.getScopeOfNode(ifStatementNode1), functionDeclarationBlockStatementNode);
  329. });
  330. it('should return scope node for `switchStatement` node child node', () => {
  331. assert.deepEqual(NodeUtils.getScopeOfNode(switchStatementNode), functionDeclarationBlockStatementNode);
  332. });
  333. it('should return scope node for `switchCase` node child node', () => {
  334. assert.deepEqual(NodeUtils.getScopeOfNode(switchCaseNode), functionDeclarationBlockStatementNode);
  335. });
  336. it('should return scope node for `ifStatement` node #2 child node', () => {
  337. assert.deepEqual(NodeUtils.getScopeOfNode(ifStatementNode2), switchCaseNode);
  338. });
  339. it('should return scope node for `ifStatement blockStatement` node #2 child node', () => {
  340. assert.deepEqual(NodeUtils.getScopeOfNode(ifStatementBlockStatementNode2), switchCaseNode);
  341. });
  342. it('should return scope node for `ifStatement blockStatement` node #1 child node', () => {
  343. assert.deepEqual(NodeUtils.getScopeOfNode(ifStatementBlockStatementNode1), functionDeclarationBlockStatementNode);
  344. });
  345. it('should return scope node for `ifStatement blockStatement` node #3 child node', () => {
  346. assert.deepEqual(NodeUtils.getScopeOfNode(ifStatementBlockStatementNode3), ifStatementBlockStatementNode1);
  347. });
  348. it('should return scope node for `expressionStatement` node #3 child node', () => {
  349. assert.deepEqual(NodeUtils.getScopeOfNode(expressionStatementNode3), ifStatementBlockStatementNode3);
  350. });
  351. it('should throw a `ReferenceError` if node has no `parentNode` property', () => {
  352. assert.throws(() => NodeUtils.getScopeOfNode(expressionStatementNode2), ReferenceError);
  353. });
  354. });
  355. describe('getUnaryExpressionArgumentNode (unaryExpressionNode: ESTree.UnaryExpression): ESTree.Node', () => {
  356. let expectedNode: ESTree.Literal,
  357. unaryExpressionArgumentNode: ESTree.Node;
  358. before(() => {
  359. const literalNode: ESTree.Literal = Nodes.getLiteralNode('test');
  360. const unaryExpressionNode2: ESTree.UnaryExpression = Nodes.getUnaryExpressionNode('!', literalNode);
  361. const unaryExpressionNode1: ESTree.UnaryExpression = Nodes.getUnaryExpressionNode('!', unaryExpressionNode2);
  362. const expressionStatementNode: ESTree.ExpressionStatement = Nodes.getExpressionStatementNode(unaryExpressionNode1);
  363. const programNode: ESTree.Program = Nodes.getProgramNode([
  364. expressionStatementNode
  365. ]);
  366. programNode.parentNode = programNode;
  367. expressionStatementNode.parentNode = programNode;
  368. unaryExpressionNode1.parentNode = expressionStatementNode;
  369. unaryExpressionNode2.parentNode = unaryExpressionNode1;
  370. literalNode.parentNode = unaryExpressionNode2;
  371. unaryExpressionArgumentNode = NodeUtils.getUnaryExpressionArgumentNode(unaryExpressionNode1);
  372. expectedNode = literalNode;
  373. });
  374. it('should return unary expression argument node', () => {
  375. assert.deepEqual(unaryExpressionArgumentNode, expectedNode);
  376. });
  377. });
  378. describe('parentize <T extends ESTree.Node> (astTree: T): T', () => {
  379. let ifStatementNode: ESTree.IfStatement,
  380. ifStatementBlockStatementNode: ESTree.BlockStatement,
  381. expressionStatementNode1: ESTree.ExpressionStatement,
  382. expressionStatementNode2: ESTree.ExpressionStatement,
  383. programNode: ESTree.Program;
  384. beforeEach(() => {
  385. expressionStatementNode1 = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier'));
  386. expressionStatementNode2 = Nodes.getExpressionStatementNode(Nodes.getIdentifierNode('identifier'));
  387. ifStatementBlockStatementNode = Nodes.getBlockStatementNode([
  388. expressionStatementNode1,
  389. expressionStatementNode2
  390. ]);
  391. ifStatementNode = Nodes.getIfStatementNode(
  392. Nodes.getLiteralNode(true),
  393. ifStatementBlockStatementNode
  394. );
  395. });
  396. describe('variant #1: parentize AST-tree with `ProgramNode` as root node', () => {
  397. beforeEach(() => {
  398. programNode = Nodes.getProgramNode([
  399. ifStatementNode
  400. ]);
  401. programNode = NodeUtils.parentize(programNode);
  402. });
  403. it('should parentize `program` node with `ProgramNode` as root node', () => {
  404. assert.deepEqual(programNode.parentNode, programNode);
  405. });
  406. it('should parentize `ifStatement` node with `ProgramNode` as root node', () => {
  407. assert.deepEqual(ifStatementNode.parentNode, programNode);
  408. });
  409. it('should parentize `ifStatement blockStatement` node with `ProgramNode` as root node', () => {
  410. assert.deepEqual(ifStatementBlockStatementNode.parentNode, ifStatementNode);
  411. });
  412. it('should parentize `expressionStatement` node #1 with `ProgramNode` as root node', () => {
  413. assert.deepEqual(expressionStatementNode1.parentNode, ifStatementBlockStatementNode);
  414. });
  415. it('should parentize `expressionStatement` node #2 with `ProgramNode` as root node', () => {
  416. assert.deepEqual(expressionStatementNode2.parentNode, ifStatementBlockStatementNode);
  417. });
  418. });
  419. describe('variant #2: parentize AST-tree', () => {
  420. beforeEach(() => {
  421. ifStatementNode = NodeUtils.parentize(ifStatementNode);
  422. });
  423. it('should parentize `ifStatement` node', () => {
  424. assert.deepEqual(ifStatementNode.parentNode, ifStatementNode);
  425. });
  426. it('should parentize `ifStatement blockStatement` node', () => {
  427. assert.deepEqual(ifStatementBlockStatementNode.parentNode, ifStatementNode);
  428. });
  429. it('should parentize `expressionStatement` node #1', () => {
  430. assert.deepEqual(expressionStatementNode1.parentNode, ifStatementBlockStatementNode);
  431. });
  432. it('should parentize `expressionStatement` node #2', () => {
  433. assert.deepEqual(expressionStatementNode2.parentNode, ifStatementBlockStatementNode);
  434. });
  435. });
  436. });
  437. describe('parentizeNode <T extends ESTree.Node = ESTree.Program> (node: T, parentNode: ESTree.Node): T', () => {
  438. describe('variant #1: node with parent node', () => {
  439. const identifier: ESTree.Identifier = Nodes.getIdentifierNode('foo');
  440. const breakStatement: ESTree.BreakStatement = Nodes.getBreakStatement(identifier);
  441. const expectedResult: ESTree.Identifier = NodeUtils.clone(identifier);
  442. let result: ESTree.Identifier;
  443. before(() => {
  444. expectedResult.parentNode = breakStatement;
  445. result = NodeUtils.parentizeNode(identifier, breakStatement);
  446. });
  447. it('should parentize given node', () => {
  448. assert.deepEqual(result, expectedResult);
  449. });
  450. });
  451. describe('variant #2: node without parent node', () => {
  452. const identifier: ESTree.Identifier = Nodes.getIdentifierNode('Foo');
  453. const expectedResult: ESTree.Identifier = NodeUtils.clone(identifier);
  454. let result: ESTree.Identifier;
  455. before(() => {
  456. expectedResult.parentNode = expectedResult;
  457. result = NodeUtils.parentizeNode(identifier, <any>null);
  458. });
  459. it('should parentize given node', () => {
  460. assert.deepEqual(result, expectedResult);
  461. });
  462. });
  463. });
  464. });