NodeLexicalScopeUtils.spec.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. import * as ESTree from 'estree';
  2. import { assert } from 'chai';
  3. import { NodeFactory } from '../../../../src/node/NodeFactory';
  4. import { NodeLexicalScopeUtils } from '../../../../src/node/NodeLexicalScopeUtils';
  5. describe('NodeLexicalScopeUtils', () => {
  6. describe('getParentScope', () => {
  7. let functionDeclarationBlockStatementNode: ESTree.BlockStatement,
  8. ifStatementBlockStatementNode1: ESTree.BlockStatement,
  9. ifStatementBlockStatementNode2: ESTree.BlockStatement,
  10. ifStatementNode1: ESTree.IfStatement,
  11. ifStatementNode2: ESTree.IfStatement,
  12. expressionStatementNode3: ESTree.ExpressionStatement,
  13. expressionStatementNode2: ESTree.ExpressionStatement,
  14. expressionStatementNode1: ESTree.ExpressionStatement,
  15. functionDeclarationNode: ESTree.FunctionDeclaration,
  16. programNode: ESTree.Program;
  17. before(() => {
  18. expressionStatementNode1 = NodeFactory.expressionStatementNode(NodeFactory.identifierNode('identifier'));
  19. expressionStatementNode2 = NodeFactory.expressionStatementNode(NodeFactory.identifierNode('identifier'));
  20. expressionStatementNode3 = NodeFactory.expressionStatementNode(NodeFactory.identifierNode('identifier'));
  21. ifStatementBlockStatementNode2 = NodeFactory.blockStatementNode([
  22. expressionStatementNode2,
  23. expressionStatementNode3
  24. ]);
  25. ifStatementNode2 = NodeFactory.ifStatementNode(
  26. NodeFactory.literalNode(true),
  27. ifStatementBlockStatementNode2
  28. );
  29. ifStatementBlockStatementNode1 = NodeFactory.blockStatementNode([
  30. ifStatementNode2
  31. ]);
  32. ifStatementNode1 = NodeFactory.ifStatementNode(
  33. NodeFactory.literalNode(true),
  34. ifStatementBlockStatementNode1
  35. );
  36. functionDeclarationBlockStatementNode = NodeFactory.blockStatementNode([
  37. expressionStatementNode1,
  38. ifStatementNode1
  39. ]);
  40. functionDeclarationNode = NodeFactory.functionDeclarationNode('test', [], functionDeclarationBlockStatementNode);
  41. programNode = NodeFactory.programNode([
  42. functionDeclarationNode
  43. ]);
  44. programNode.parentNode = programNode;
  45. functionDeclarationNode.parentNode = programNode;
  46. functionDeclarationBlockStatementNode.parentNode = functionDeclarationNode;
  47. expressionStatementNode1.parentNode = functionDeclarationBlockStatementNode;
  48. ifStatementNode1.parentNode = functionDeclarationBlockStatementNode;
  49. ifStatementBlockStatementNode1.parentNode = ifStatementNode1;
  50. ifStatementNode2.parentNode = ifStatementBlockStatementNode1;
  51. ifStatementBlockStatementNode2.parentNode = ifStatementNode2;
  52. expressionStatementNode3.parentNode = ifStatementBlockStatementNode2;
  53. });
  54. it('should return lexical scope node for `program` node child node', () => {
  55. assert.deepEqual(NodeLexicalScopeUtils.getLexicalScope(programNode), programNode);
  56. });
  57. it('should return lexical scope node for `functionDeclaration` node child node', () => {
  58. assert.deepEqual(NodeLexicalScopeUtils.getLexicalScope(functionDeclarationNode), functionDeclarationNode);
  59. });
  60. it('should return lexical scope node for `functionDeclaration blockStatement` node child node', () => {
  61. assert.deepEqual(NodeLexicalScopeUtils.getLexicalScope(functionDeclarationBlockStatementNode), functionDeclarationNode);
  62. });
  63. it('should return lexical scope node for `expressionStatement` node #1 child node', () => {
  64. assert.deepEqual(NodeLexicalScopeUtils.getLexicalScope(expressionStatementNode1), functionDeclarationNode);
  65. });
  66. it('should return lexical scope node for `ifStatement` node child node', () => {
  67. assert.deepEqual(NodeLexicalScopeUtils.getLexicalScope(ifStatementNode1), functionDeclarationNode);
  68. });
  69. it('should return lexical scope node for `ifStatement blockStatement` node #1 child node', () => {
  70. assert.deepEqual(NodeLexicalScopeUtils.getLexicalScope(ifStatementBlockStatementNode1), functionDeclarationNode);
  71. });
  72. it('should return lexical scope node for `ifStatement blockStatement` node #2 child node', () => {
  73. assert.deepEqual(NodeLexicalScopeUtils.getLexicalScope(ifStatementBlockStatementNode2), functionDeclarationNode);
  74. });
  75. it('should return lexical scope node for `expressionStatement` node #3 child node', () => {
  76. assert.deepEqual(NodeLexicalScopeUtils.getLexicalScope(expressionStatementNode3), functionDeclarationNode);
  77. });
  78. it('should throw a `ReferenceError` if node has no `parentNode` property', () => {
  79. assert.throws(() => NodeLexicalScopeUtils.getLexicalScope(expressionStatementNode2), ReferenceError);
  80. });
  81. });
  82. describe('getParentScopes', () => {
  83. let functionDeclarationBlockStatementNode: ESTree.BlockStatement,
  84. ifStatementBlockStatementNode1: ESTree.BlockStatement,
  85. ifStatementBlockStatementNode2: ESTree.BlockStatement,
  86. ifStatementNode1: ESTree.IfStatement,
  87. ifStatementNode2: ESTree.IfStatement,
  88. expressionStatementNode3: ESTree.ExpressionStatement,
  89. expressionStatementNode2: ESTree.ExpressionStatement,
  90. expressionStatementNode1: ESTree.ExpressionStatement,
  91. functionDeclarationNode: ESTree.FunctionDeclaration,
  92. programNode: ESTree.Program;
  93. before(() => {
  94. expressionStatementNode1 = NodeFactory.expressionStatementNode(NodeFactory.identifierNode('identifier'));
  95. expressionStatementNode2 = NodeFactory.expressionStatementNode(NodeFactory.identifierNode('identifier'));
  96. expressionStatementNode3 = NodeFactory.expressionStatementNode(NodeFactory.identifierNode('identifier'));
  97. ifStatementBlockStatementNode2 = NodeFactory.blockStatementNode([
  98. expressionStatementNode2,
  99. expressionStatementNode3
  100. ]);
  101. ifStatementNode2 = NodeFactory.ifStatementNode(
  102. NodeFactory.literalNode(true),
  103. ifStatementBlockStatementNode2
  104. );
  105. ifStatementBlockStatementNode1 = NodeFactory.blockStatementNode([
  106. ifStatementNode2
  107. ]);
  108. ifStatementNode1 = NodeFactory.ifStatementNode(
  109. NodeFactory.literalNode(true),
  110. ifStatementBlockStatementNode1
  111. );
  112. functionDeclarationBlockStatementNode = NodeFactory.blockStatementNode([
  113. expressionStatementNode1,
  114. ifStatementNode1
  115. ]);
  116. functionDeclarationNode = NodeFactory.functionDeclarationNode('test', [], functionDeclarationBlockStatementNode);
  117. programNode = NodeFactory.programNode([
  118. functionDeclarationNode
  119. ]);
  120. programNode.parentNode = programNode;
  121. functionDeclarationNode.parentNode = programNode;
  122. functionDeclarationBlockStatementNode.parentNode = functionDeclarationNode;
  123. expressionStatementNode1.parentNode = functionDeclarationBlockStatementNode;
  124. ifStatementNode1.parentNode = functionDeclarationBlockStatementNode;
  125. ifStatementBlockStatementNode1.parentNode = ifStatementNode1;
  126. ifStatementNode2.parentNode = ifStatementBlockStatementNode1;
  127. ifStatementBlockStatementNode2.parentNode = ifStatementNode2;
  128. expressionStatementNode3.parentNode = ifStatementBlockStatementNode2;
  129. });
  130. it('should return lexical scope node for `program` node child node', () => {
  131. assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(programNode)[0], programNode);
  132. });
  133. it('should return lexical scope node for `functionDeclaration` node child node #1', () => {
  134. assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(functionDeclarationNode)[0], functionDeclarationNode);
  135. });
  136. it('should return lexical scope node for `functionDeclaration` node child node #2', () => {
  137. assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(functionDeclarationNode)[1], programNode);
  138. });
  139. it('should return lexical scope node for `functionDeclaration blockStatement` node child node #1', () => {
  140. assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(functionDeclarationBlockStatementNode)[0], functionDeclarationNode);
  141. });
  142. it('should return lexical scope node for `expressionStatement` node #1 child node #1', () => {
  143. assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(expressionStatementNode1)[0], functionDeclarationNode);
  144. });
  145. it('should return lexical scope node for `expressionStatement` node #1 child node #2', () => {
  146. assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(expressionStatementNode1)[1], programNode);
  147. });
  148. it('should return lexical scope node for `ifStatement` node child node #1', () => {
  149. assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(ifStatementNode1)[0], functionDeclarationNode);
  150. });
  151. it('should return lexical scope node for `ifStatement` node child node #2', () => {
  152. assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(ifStatementNode1)[1], programNode);
  153. });
  154. it('should return lexical scope node for `ifStatement blockStatement` node #1 child node #1', () => {
  155. assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(ifStatementBlockStatementNode1)[0], functionDeclarationNode);
  156. });
  157. it('should return lexical scope node for `ifStatement blockStatement` node #1 child node #2', () => {
  158. assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(ifStatementBlockStatementNode1)[1], programNode);
  159. });
  160. it('should return lexical scope node for `ifStatement blockStatement` node #2 child node #1', () => {
  161. assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(ifStatementBlockStatementNode2)[0], functionDeclarationNode);
  162. });
  163. it('should return lexical scope node for `ifStatement blockStatement` node #1 child node #2', () => {
  164. assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(ifStatementBlockStatementNode2)[1], programNode);
  165. });
  166. it('should return lexical scope node for `expressionStatement` node #3 child node #1', () => {
  167. assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(expressionStatementNode3)[0], functionDeclarationNode);
  168. });
  169. it('should return lexical scope node for `expressionStatement` node #3 child node #2', () => {
  170. assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(expressionStatementNode3)[1], programNode);
  171. });
  172. it('should throw a `ReferenceError` if node has no `parentNode` property', () => {
  173. assert.throws(() => NodeLexicalScopeUtils.getLexicalScopes(expressionStatementNode2)[0], ReferenceError);
  174. });
  175. });
  176. });