NodeStatementUtils.spec.ts 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  1. import * as ESTree from 'estree';
  2. import { assert } from 'chai';
  3. import { NodeFactory } from '../../../../src/node/NodeFactory';
  4. import { NodeStatementUtils } from '../../../../src/node/NodeStatementUtils';
  5. import { NodeUtils } from '../../../../src/node/NodeUtils';
  6. describe('NodeStatementUtils', () => {
  7. describe('getParentNodeWithStatements', () => {
  8. let functionDeclarationBlockStatementNode: ESTree.BlockStatement,
  9. ifStatementBlockStatementNode1: ESTree.BlockStatement,
  10. ifStatementBlockStatementNode2: ESTree.BlockStatement,
  11. ifStatementNode1: ESTree.IfStatement,
  12. ifStatementNode2: ESTree.IfStatement,
  13. expressionStatementNode3: ESTree.ExpressionStatement,
  14. expressionStatementNode2: ESTree.ExpressionStatement,
  15. expressionStatementNode1: ESTree.ExpressionStatement,
  16. functionDeclarationNode: ESTree.FunctionDeclaration,
  17. programNode: ESTree.Program;
  18. before(() => {
  19. expressionStatementNode1 = NodeFactory.expressionStatementNode(NodeFactory.identifierNode('identifier'));
  20. expressionStatementNode2 = NodeFactory.expressionStatementNode(NodeFactory.identifierNode('identifier'));
  21. expressionStatementNode3 = NodeFactory.expressionStatementNode(NodeFactory.identifierNode('identifier'));
  22. ifStatementBlockStatementNode2 = NodeFactory.blockStatementNode([
  23. expressionStatementNode2,
  24. expressionStatementNode3
  25. ]);
  26. ifStatementNode2 = NodeFactory.ifStatementNode(
  27. NodeFactory.literalNode(true),
  28. ifStatementBlockStatementNode2
  29. );
  30. ifStatementBlockStatementNode1 = NodeFactory.blockStatementNode([
  31. ifStatementNode2
  32. ]);
  33. ifStatementNode1 = NodeFactory.ifStatementNode(
  34. NodeFactory.literalNode(true),
  35. ifStatementBlockStatementNode1
  36. );
  37. functionDeclarationBlockStatementNode = NodeFactory.blockStatementNode([
  38. expressionStatementNode1,
  39. ifStatementNode1
  40. ]);
  41. functionDeclarationNode = NodeFactory.functionDeclarationNode('test', [], functionDeclarationBlockStatementNode);
  42. programNode = NodeFactory.programNode([
  43. functionDeclarationNode
  44. ]);
  45. programNode.parentNode = programNode;
  46. functionDeclarationNode.parentNode = programNode;
  47. functionDeclarationBlockStatementNode.parentNode = functionDeclarationNode;
  48. expressionStatementNode1.parentNode = functionDeclarationBlockStatementNode;
  49. ifStatementNode1.parentNode = functionDeclarationBlockStatementNode;
  50. ifStatementBlockStatementNode1.parentNode = ifStatementNode1;
  51. ifStatementNode2.parentNode = ifStatementBlockStatementNode1;
  52. ifStatementBlockStatementNode2.parentNode = ifStatementNode2;
  53. expressionStatementNode3.parentNode = ifStatementBlockStatementNode2;
  54. });
  55. it('should return parent node with statements for `program` node child node', () => {
  56. assert.deepEqual(NodeStatementUtils.getParentNodeWithStatements(programNode), programNode);
  57. });
  58. it('should return parent node with statements node for `functionDeclaration` node child node', () => {
  59. assert.deepEqual(NodeStatementUtils.getParentNodeWithStatements(functionDeclarationNode), programNode);
  60. });
  61. it('should return parent node with statements node for `functionDeclaration blockStatement` node child node', () => {
  62. assert.deepEqual(NodeStatementUtils.getParentNodeWithStatements(functionDeclarationBlockStatementNode), programNode);
  63. });
  64. it('should return parent node with statements node for `expressionStatement` node #1 child node', () => {
  65. assert.deepEqual(NodeStatementUtils.getParentNodeWithStatements(expressionStatementNode1), functionDeclarationBlockStatementNode);
  66. });
  67. it('should return parent node with statements node for `ifStatement` node child node', () => {
  68. assert.deepEqual(NodeStatementUtils.getParentNodeWithStatements(ifStatementNode1), functionDeclarationBlockStatementNode);
  69. });
  70. it('should return parent node with statements node for `ifStatement blockStatement` node #1 child node', () => {
  71. assert.deepEqual(NodeStatementUtils.getParentNodeWithStatements(ifStatementBlockStatementNode1), functionDeclarationBlockStatementNode);
  72. });
  73. it('should return parent node with statements node for `ifStatement blockStatement` node #2 child node', () => {
  74. assert.deepEqual(NodeStatementUtils.getParentNodeWithStatements(ifStatementBlockStatementNode2), functionDeclarationBlockStatementNode);
  75. });
  76. it('should return parent node with statements node for `expressionStatement` node #3 child node', () => {
  77. assert.deepEqual(NodeStatementUtils.getParentNodeWithStatements(expressionStatementNode3), functionDeclarationBlockStatementNode);
  78. });
  79. it('should throw a `ReferenceError` if node has no `parentNode` property', () => {
  80. assert.throws(() => NodeStatementUtils.getParentNodeWithStatements(expressionStatementNode2), ReferenceError);
  81. });
  82. });
  83. describe('getParentNodesWithStatements', () => {
  84. let functionDeclarationBlockStatementNode: ESTree.BlockStatement,
  85. ifStatementBlockStatementNode1: ESTree.BlockStatement,
  86. ifStatementBlockStatementNode2: ESTree.BlockStatement,
  87. ifStatementNode1: ESTree.IfStatement,
  88. ifStatementNode2: ESTree.IfStatement,
  89. expressionStatementNode3: ESTree.ExpressionStatement,
  90. expressionStatementNode2: ESTree.ExpressionStatement,
  91. expressionStatementNode1: ESTree.ExpressionStatement,
  92. functionDeclarationNode: ESTree.FunctionDeclaration,
  93. programNode: ESTree.Program;
  94. before(() => {
  95. expressionStatementNode1 = NodeFactory.expressionStatementNode(NodeFactory.identifierNode('identifier'));
  96. expressionStatementNode2 = NodeFactory.expressionStatementNode(NodeFactory.identifierNode('identifier'));
  97. expressionStatementNode3 = NodeFactory.expressionStatementNode(NodeFactory.identifierNode('identifier'));
  98. ifStatementBlockStatementNode2 = NodeFactory.blockStatementNode([
  99. expressionStatementNode2,
  100. expressionStatementNode3
  101. ]);
  102. ifStatementNode2 = NodeFactory.ifStatementNode(
  103. NodeFactory.literalNode(true),
  104. ifStatementBlockStatementNode2
  105. );
  106. ifStatementBlockStatementNode1 = NodeFactory.blockStatementNode([
  107. ifStatementNode2
  108. ]);
  109. ifStatementNode1 = NodeFactory.ifStatementNode(
  110. NodeFactory.literalNode(true),
  111. ifStatementBlockStatementNode1
  112. );
  113. functionDeclarationBlockStatementNode = NodeFactory.blockStatementNode([
  114. expressionStatementNode1,
  115. ifStatementNode1
  116. ]);
  117. functionDeclarationNode = NodeFactory.functionDeclarationNode('test', [], functionDeclarationBlockStatementNode);
  118. programNode = NodeFactory.programNode([
  119. functionDeclarationNode
  120. ]);
  121. programNode.parentNode = programNode;
  122. functionDeclarationNode.parentNode = programNode;
  123. functionDeclarationBlockStatementNode.parentNode = functionDeclarationNode;
  124. expressionStatementNode1.parentNode = functionDeclarationBlockStatementNode;
  125. ifStatementNode1.parentNode = functionDeclarationBlockStatementNode;
  126. ifStatementBlockStatementNode1.parentNode = ifStatementNode1;
  127. ifStatementNode2.parentNode = ifStatementBlockStatementNode1;
  128. ifStatementBlockStatementNode2.parentNode = ifStatementNode2;
  129. expressionStatementNode3.parentNode = ifStatementBlockStatementNode2;
  130. });
  131. it('should return parent node with statements node for `program` node child node', () => {
  132. assert.deepEqual(NodeStatementUtils.getParentNodesWithStatements(programNode)[0], programNode);
  133. });
  134. it('should return parent node with statements node for `functionDeclaration` node child node #1', () => {
  135. assert.deepEqual(NodeStatementUtils.getParentNodesWithStatements(functionDeclarationNode)[0], programNode);
  136. });
  137. it('should return parent node with statements node for `functionDeclaration blockStatement` node child node #1', () => {
  138. assert.deepEqual(NodeStatementUtils.getParentNodesWithStatements(functionDeclarationBlockStatementNode)[0], programNode);
  139. });
  140. it('should return parent node with statements node for `expressionStatement` node #1 child node #1', () => {
  141. assert.deepEqual(NodeStatementUtils.getParentNodesWithStatements(expressionStatementNode1)[0], functionDeclarationBlockStatementNode);
  142. });
  143. it('should return parent node with statements node for `expressionStatement` node #1 child node #2', () => {
  144. assert.deepEqual(NodeStatementUtils.getParentNodesWithStatements(expressionStatementNode1)[1], programNode);
  145. });
  146. it('should return parent node with statements node for `ifStatement` node child node #1', () => {
  147. assert.deepEqual(NodeStatementUtils.getParentNodesWithStatements(ifStatementNode1)[0], functionDeclarationBlockStatementNode);
  148. });
  149. it('should return parent node with statements node for `ifStatement` node child node #2', () => {
  150. assert.deepEqual(NodeStatementUtils.getParentNodesWithStatements(ifStatementNode1)[1], programNode);
  151. });
  152. it('should return parent node with statements node for `ifStatement blockStatement` node #1 child node #1', () => {
  153. assert.deepEqual(NodeStatementUtils.getParentNodesWithStatements(ifStatementBlockStatementNode1)[0], functionDeclarationBlockStatementNode);
  154. });
  155. it('should return parent node with statements node for `ifStatement blockStatement` node #1 child node #2', () => {
  156. assert.deepEqual(NodeStatementUtils.getParentNodesWithStatements(ifStatementBlockStatementNode1)[1], programNode);
  157. });
  158. it('should return parent node with statements node for `ifStatement blockStatement` node #2 child node #1', () => {
  159. assert.deepEqual(NodeStatementUtils.getParentNodesWithStatements(ifStatementBlockStatementNode2)[0], functionDeclarationBlockStatementNode);
  160. });
  161. it('should return parent node with statements node for `ifStatement blockStatement` node #1 child node #2', () => {
  162. assert.deepEqual(NodeStatementUtils.getParentNodesWithStatements(ifStatementBlockStatementNode2)[1], programNode);
  163. });
  164. it('should return parent node with statements node for `expressionStatement` node #3 child node #1', () => {
  165. assert.deepEqual(NodeStatementUtils.getParentNodesWithStatements(expressionStatementNode3)[0], functionDeclarationBlockStatementNode);
  166. });
  167. it('should return parent node with statements node for `expressionStatement` node #3 child node #2', () => {
  168. assert.deepEqual(NodeStatementUtils.getParentNodesWithStatements(expressionStatementNode3)[1], programNode);
  169. });
  170. it('should throw a `ReferenceError` if node has no `parentNode` property', () => {
  171. assert.throws(() => NodeStatementUtils.getParentNodesWithStatements(expressionStatementNode2)[0], ReferenceError);
  172. });
  173. });
  174. describe('getNextSiblingStatement', () => {
  175. describe('Variant #1: block statement node as scope node', () => {
  176. let statementNode1: ESTree.Statement,
  177. statementNode2: ESTree.Statement,
  178. statementNode3: ESTree.Statement;
  179. before(() => {
  180. statementNode1 = NodeFactory.expressionStatementNode(
  181. NodeFactory.identifierNode('a')
  182. );
  183. statementNode2 = NodeFactory.expressionStatementNode(
  184. NodeFactory.identifierNode('b')
  185. );
  186. statementNode3 = NodeFactory.expressionStatementNode(
  187. NodeFactory.identifierNode('c')
  188. );
  189. const blockStatementNode: ESTree.BlockStatement = NodeFactory.blockStatementNode([
  190. statementNode1,
  191. statementNode2,
  192. statementNode3
  193. ]);
  194. statementNode1.parentNode = blockStatementNode;
  195. statementNode2.parentNode = blockStatementNode;
  196. statementNode3.parentNode = blockStatementNode;
  197. });
  198. it('should return next sibling statement node', () => {
  199. assert.deepEqual(NodeStatementUtils.getNextSiblingStatement(statementNode1), statementNode2);
  200. });
  201. it('should return next sibling statement node', () => {
  202. assert.deepEqual(NodeStatementUtils.getNextSiblingStatement(statementNode2), statementNode3);
  203. });
  204. it('should return `null` if given statement node is last node in the scope', () => {
  205. assert.deepEqual(NodeStatementUtils.getNextSiblingStatement(statementNode3), null);
  206. });
  207. });
  208. describe('Variant #2: switch case node as scope node', () => {
  209. let statementNode1: ESTree.Statement,
  210. statementNode2: ESTree.Statement,
  211. statementNode3: ESTree.Statement;
  212. before(() => {
  213. statementNode1 = NodeFactory.expressionStatementNode(
  214. NodeFactory.identifierNode('a')
  215. );
  216. statementNode2 = NodeFactory.expressionStatementNode(
  217. NodeFactory.identifierNode('b')
  218. );
  219. statementNode3 = NodeFactory.expressionStatementNode(
  220. NodeFactory.identifierNode('c')
  221. );
  222. const switchCaseNode: ESTree.SwitchCase = NodeFactory.switchCaseNode(
  223. NodeFactory.literalNode(true),
  224. [
  225. statementNode1,
  226. statementNode2,
  227. statementNode3
  228. ]
  229. );
  230. statementNode1.parentNode = switchCaseNode;
  231. statementNode2.parentNode = switchCaseNode;
  232. statementNode3.parentNode = switchCaseNode;
  233. });
  234. it('should return next sibling statement node', () => {
  235. assert.deepEqual(NodeStatementUtils.getNextSiblingStatement(statementNode1), statementNode2);
  236. });
  237. it('should return next sibling statement node', () => {
  238. assert.deepEqual(NodeStatementUtils.getNextSiblingStatement(statementNode2), statementNode3);
  239. });
  240. it('should return `null` if given statement node is last node in the scope', () => {
  241. assert.deepEqual(NodeStatementUtils.getNextSiblingStatement(statementNode3), null);
  242. });
  243. });
  244. });
  245. describe('getPreviousSiblingStatement', () => {
  246. describe('Variant #1: block statement node as scope node', () => {
  247. let statementNode1: ESTree.Statement,
  248. statementNode2: ESTree.Statement,
  249. statementNode3: ESTree.Statement;
  250. before(() => {
  251. statementNode1 = NodeFactory.expressionStatementNode(
  252. NodeFactory.identifierNode('a')
  253. );
  254. statementNode2 = NodeFactory.expressionStatementNode(
  255. NodeFactory.identifierNode('b')
  256. );
  257. statementNode3 = NodeFactory.expressionStatementNode(
  258. NodeFactory.identifierNode('c')
  259. );
  260. const blockStatementNode: ESTree.BlockStatement = NodeFactory.blockStatementNode([
  261. statementNode1,
  262. statementNode2,
  263. statementNode3
  264. ]);
  265. statementNode1.parentNode = blockStatementNode;
  266. statementNode2.parentNode = blockStatementNode;
  267. statementNode3.parentNode = blockStatementNode;
  268. });
  269. it('should return next sibling statement node', () => {
  270. assert.deepEqual(NodeStatementUtils.getPreviousSiblingStatement(statementNode1), null);
  271. });
  272. it('should return next sibling statement node', () => {
  273. assert.deepEqual(NodeStatementUtils.getPreviousSiblingStatement(statementNode2), statementNode1);
  274. });
  275. it('should return `null` if given statement node is last node in the scope', () => {
  276. assert.deepEqual(NodeStatementUtils.getPreviousSiblingStatement(statementNode3), statementNode2);
  277. });
  278. });
  279. describe('Variant #2: switch case node as scope node', () => {
  280. let statementNode1: ESTree.Statement,
  281. statementNode2: ESTree.Statement,
  282. statementNode3: ESTree.Statement;
  283. before(() => {
  284. statementNode1 = NodeFactory.expressionStatementNode(
  285. NodeFactory.identifierNode('a')
  286. );
  287. statementNode2 = NodeFactory.expressionStatementNode(
  288. NodeFactory.identifierNode('b')
  289. );
  290. statementNode3 = NodeFactory.expressionStatementNode(
  291. NodeFactory.identifierNode('c')
  292. );
  293. const switchCaseNode: ESTree.SwitchCase = NodeFactory.switchCaseNode(
  294. NodeFactory.literalNode(true),
  295. [
  296. statementNode1,
  297. statementNode2,
  298. statementNode3
  299. ]
  300. );
  301. statementNode1.parentNode = switchCaseNode;
  302. statementNode2.parentNode = switchCaseNode;
  303. statementNode3.parentNode = switchCaseNode;
  304. });
  305. it('should return next sibling statement node', () => {
  306. assert.deepEqual(NodeStatementUtils.getPreviousSiblingStatement(statementNode1), null);
  307. });
  308. it('should return next sibling statement node', () => {
  309. assert.deepEqual(NodeStatementUtils.getPreviousSiblingStatement(statementNode2), statementNode1);
  310. });
  311. it('should return `null` if given statement node is last node in the scope', () => {
  312. assert.deepEqual(NodeStatementUtils.getPreviousSiblingStatement(statementNode3), statementNode2);
  313. });
  314. });
  315. });
  316. describe('getRootStatementOfNode', () => {
  317. let assignmentExpression: ESTree.AssignmentExpression,
  318. expressionStatement: ESTree.ExpressionStatement,
  319. identifierNode1: ESTree.Identifier,
  320. identifierNode2: ESTree.Identifier,
  321. identifierNode3: ESTree.Identifier,
  322. identifierNode4: ESTree.Identifier,
  323. identifierNode5: ESTree.Identifier,
  324. functionDeclarationNode: ESTree.FunctionDeclaration,
  325. functionDeclarationBlockStatementNode: ESTree.BlockStatement,
  326. programNode: ESTree.Program,
  327. variableDeclarationNode: ESTree.VariableDeclaration;
  328. before(() => {
  329. identifierNode1 = NodeFactory.identifierNode('identifier');
  330. identifierNode2 = NodeFactory.identifierNode('identifier');
  331. identifierNode3 = NodeFactory.identifierNode('identifier');
  332. identifierNode4 = NodeFactory.identifierNode('foo');
  333. identifierNode5 = NodeFactory.identifierNode('bar');
  334. assignmentExpression = NodeFactory.assignmentExpressionNode(
  335. '=',
  336. identifierNode4,
  337. identifierNode5
  338. );
  339. expressionStatement = NodeFactory.expressionStatementNode(
  340. assignmentExpression
  341. );
  342. variableDeclarationNode = NodeFactory.variableDeclarationNode([
  343. NodeFactory.variableDeclaratorNode(
  344. identifierNode1,
  345. NodeFactory.binaryExpressionNode(
  346. '+',
  347. identifierNode2,
  348. identifierNode3
  349. )
  350. )
  351. ]);
  352. functionDeclarationBlockStatementNode = NodeFactory.blockStatementNode([
  353. variableDeclarationNode
  354. ]);
  355. functionDeclarationNode = NodeFactory.functionDeclarationNode('test', [], functionDeclarationBlockStatementNode);
  356. programNode = NodeFactory.programNode([
  357. functionDeclarationNode,
  358. NodeFactory.ifStatementNode(
  359. NodeFactory.literalNode(true),
  360. NodeFactory.blockStatementNode([
  361. expressionStatement
  362. ])
  363. )
  364. ]);
  365. NodeUtils.parentizeAst(programNode);
  366. identifierNode3.parentNode = undefined;
  367. });
  368. it('should return root statement in scope for `program` node child', () => {
  369. assert.throws(() => NodeStatementUtils.getRootStatementOfNode(programNode), Error);
  370. });
  371. it('should return root statement in scope for `functionDeclaration` node #1', () => {
  372. assert.deepEqual(NodeStatementUtils.getRootStatementOfNode(functionDeclarationNode), functionDeclarationNode);
  373. });
  374. it('should return root statement in scope for `functionDeclaration blockStatement` node #1', () => {
  375. assert.deepEqual(NodeStatementUtils.getRootStatementOfNode(functionDeclarationBlockStatementNode), functionDeclarationNode);
  376. });
  377. it('should return root statement in scope for `identifier` node #1', () => {
  378. assert.deepEqual(NodeStatementUtils.getRootStatementOfNode(identifierNode1), variableDeclarationNode);
  379. });
  380. it('should return root statement in scope for `identifier` node #2', () => {
  381. assert.deepEqual(NodeStatementUtils.getRootStatementOfNode(identifierNode2), variableDeclarationNode);
  382. });
  383. it('should return root statement in scope for `identifier` node #4', () => {
  384. assert.deepEqual(NodeStatementUtils.getRootStatementOfNode(identifierNode4), expressionStatement);
  385. });
  386. it('should return root statement in scope for `identifier` node #5', () => {
  387. assert.deepEqual(NodeStatementUtils.getRootStatementOfNode(identifierNode5), expressionStatement);
  388. });
  389. it('should throw a `ReferenceError` if node has no `parentNode` property', () => {
  390. assert.throws(() => NodeStatementUtils.getRootStatementOfNode(identifierNode3), ReferenceError);
  391. });
  392. });
  393. describe('getScopeOfNode', () => {
  394. let functionDeclarationBlockStatementNode: ESTree.BlockStatement,
  395. ifStatementBlockStatementNode1: ESTree.BlockStatement,
  396. ifStatementBlockStatementNode2: ESTree.BlockStatement,
  397. ifStatementBlockStatementNode3: ESTree.BlockStatement,
  398. ifStatementNode1: ESTree.IfStatement,
  399. ifStatementNode2: ESTree.IfStatement,
  400. ifStatementNode3: ESTree.IfStatement,
  401. switchCaseNode: ESTree.SwitchCase,
  402. switchStatementNode: ESTree.SwitchStatement,
  403. expressionStatementNode3: ESTree.ExpressionStatement,
  404. expressionStatementNode2: ESTree.ExpressionStatement,
  405. expressionStatementNode1: ESTree.ExpressionStatement,
  406. functionDeclarationNode: ESTree.FunctionDeclaration,
  407. programNode: ESTree.Program;
  408. before(() => {
  409. expressionStatementNode1 = NodeFactory.expressionStatementNode(NodeFactory.identifierNode('identifier'));
  410. expressionStatementNode2 = NodeFactory.expressionStatementNode(NodeFactory.identifierNode('identifier'));
  411. expressionStatementNode3 = NodeFactory.expressionStatementNode(NodeFactory.identifierNode('identifier'));
  412. ifStatementBlockStatementNode3 = NodeFactory.blockStatementNode([
  413. expressionStatementNode2,
  414. expressionStatementNode3
  415. ]);
  416. ifStatementNode3 = NodeFactory.ifStatementNode(
  417. NodeFactory.literalNode(true),
  418. ifStatementBlockStatementNode3
  419. );
  420. ifStatementBlockStatementNode2 = NodeFactory.blockStatementNode();
  421. ifStatementBlockStatementNode1 = NodeFactory.blockStatementNode([
  422. ifStatementNode3
  423. ]);
  424. ifStatementNode2 = NodeFactory.ifStatementNode(
  425. NodeFactory.literalNode(true),
  426. ifStatementBlockStatementNode2
  427. );
  428. ifStatementNode1 = NodeFactory.ifStatementNode(
  429. NodeFactory.literalNode(true),
  430. ifStatementBlockStatementNode1
  431. );
  432. switchCaseNode = NodeFactory.switchCaseNode(
  433. NodeFactory.literalNode(1),
  434. [
  435. ifStatementNode2
  436. ]
  437. );
  438. switchStatementNode = NodeFactory.switchStatementNode(
  439. NodeFactory.literalNode(1),
  440. [
  441. switchCaseNode
  442. ]
  443. );
  444. functionDeclarationBlockStatementNode = NodeFactory.blockStatementNode([
  445. expressionStatementNode1,
  446. ifStatementNode1,
  447. switchStatementNode
  448. ]);
  449. functionDeclarationNode = NodeFactory.functionDeclarationNode('test', [], functionDeclarationBlockStatementNode);
  450. programNode = NodeFactory.programNode([
  451. functionDeclarationNode
  452. ]);
  453. programNode.parentNode = programNode;
  454. functionDeclarationNode.parentNode = programNode;
  455. functionDeclarationBlockStatementNode.parentNode = functionDeclarationNode;
  456. expressionStatementNode1.parentNode = functionDeclarationBlockStatementNode;
  457. ifStatementNode1.parentNode = functionDeclarationBlockStatementNode;
  458. ifStatementBlockStatementNode1.parentNode = ifStatementNode1;
  459. switchStatementNode.parentNode = functionDeclarationBlockStatementNode;
  460. switchCaseNode.parentNode = switchStatementNode;
  461. ifStatementNode2.parentNode = switchCaseNode;
  462. ifStatementBlockStatementNode2.parentNode = ifStatementNode2;
  463. ifStatementNode3.parentNode = ifStatementBlockStatementNode1;
  464. ifStatementBlockStatementNode3.parentNode = ifStatementNode3;
  465. expressionStatementNode3.parentNode = ifStatementBlockStatementNode3;
  466. });
  467. it('should return scope node for `program` node child', () => {
  468. assert.deepEqual(NodeStatementUtils.getScopeOfNode(programNode), programNode);
  469. });
  470. it('should return scope node for `functionDeclaration` node child node #1', () => {
  471. assert.deepEqual(NodeStatementUtils.getScopeOfNode(functionDeclarationNode), programNode);
  472. });
  473. it('should return scope node for `functionDeclaration blockStatement` node child node #1', () => {
  474. assert.deepEqual(NodeStatementUtils.getScopeOfNode(functionDeclarationBlockStatementNode), programNode);
  475. });
  476. it('should return scope node for `expressionStatement` node #1 child node', () => {
  477. assert.deepEqual(NodeStatementUtils.getScopeOfNode(expressionStatementNode1), functionDeclarationBlockStatementNode);
  478. });
  479. it('should return scope node for `ifStatement` node #1 child node', () => {
  480. assert.deepEqual(NodeStatementUtils.getScopeOfNode(ifStatementNode1), functionDeclarationBlockStatementNode);
  481. });
  482. it('should return scope node for `switchStatement` node child node', () => {
  483. assert.deepEqual(NodeStatementUtils.getScopeOfNode(switchStatementNode), functionDeclarationBlockStatementNode);
  484. });
  485. it('should return scope node for `switchCase` node child node', () => {
  486. assert.deepEqual(NodeStatementUtils.getScopeOfNode(switchCaseNode), functionDeclarationBlockStatementNode);
  487. });
  488. it('should return scope node for `ifStatement` node #2 child node', () => {
  489. assert.deepEqual(NodeStatementUtils.getScopeOfNode(ifStatementNode2), switchCaseNode);
  490. });
  491. it('should return scope node for `ifStatement blockStatement` node #2 child node', () => {
  492. assert.deepEqual(NodeStatementUtils.getScopeOfNode(ifStatementBlockStatementNode2), switchCaseNode);
  493. });
  494. it('should return scope node for `ifStatement blockStatement` node #1 child node', () => {
  495. assert.deepEqual(NodeStatementUtils.getScopeOfNode(ifStatementBlockStatementNode1), functionDeclarationBlockStatementNode);
  496. });
  497. it('should return scope node for `ifStatement blockStatement` node #3 child node', () => {
  498. assert.deepEqual(NodeStatementUtils.getScopeOfNode(ifStatementBlockStatementNode3), ifStatementBlockStatementNode1);
  499. });
  500. it('should return scope node for `expressionStatement` node #3 child node', () => {
  501. assert.deepEqual(NodeStatementUtils.getScopeOfNode(expressionStatementNode3), ifStatementBlockStatementNode3);
  502. });
  503. it('should throw a `ReferenceError` if node has no `parentNode` property', () => {
  504. assert.throws(() => NodeStatementUtils.getScopeOfNode(expressionStatementNode2), ReferenceError);
  505. });
  506. });
  507. });