123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- import * as ESTree from 'estree';
- import { assert } from 'chai';
- import { NodeFactory } from '../../../../src/node/NodeFactory';
- import { NodeLexicalScopeUtils } from '../../../../src/node/NodeLexicalScopeUtils';
- describe('NodeLexicalScopeUtils', () => {
- describe('getParentScope', () => {
- let functionDeclarationBlockStatementNode: ESTree.BlockStatement,
- ifStatementBlockStatementNode1: ESTree.BlockStatement,
- ifStatementBlockStatementNode2: ESTree.BlockStatement,
- ifStatementNode1: ESTree.IfStatement,
- ifStatementNode2: ESTree.IfStatement,
- expressionStatementNode3: ESTree.ExpressionStatement,
- expressionStatementNode2: ESTree.ExpressionStatement,
- expressionStatementNode1: ESTree.ExpressionStatement,
- functionDeclarationNode: ESTree.FunctionDeclaration,
- programNode: ESTree.Program;
- before(() => {
- expressionStatementNode1 = NodeFactory.expressionStatementNode(NodeFactory.identifierNode('identifier'));
- expressionStatementNode2 = NodeFactory.expressionStatementNode(NodeFactory.identifierNode('identifier'));
- expressionStatementNode3 = NodeFactory.expressionStatementNode(NodeFactory.identifierNode('identifier'));
- ifStatementBlockStatementNode2 = NodeFactory.blockStatementNode([
- expressionStatementNode2,
- expressionStatementNode3
- ]);
- ifStatementNode2 = NodeFactory.ifStatementNode(
- NodeFactory.literalNode(true),
- ifStatementBlockStatementNode2
- );
- ifStatementBlockStatementNode1 = NodeFactory.blockStatementNode([
- ifStatementNode2
- ]);
- ifStatementNode1 = NodeFactory.ifStatementNode(
- NodeFactory.literalNode(true),
- ifStatementBlockStatementNode1
- );
- functionDeclarationBlockStatementNode = NodeFactory.blockStatementNode([
- expressionStatementNode1,
- ifStatementNode1
- ]);
- functionDeclarationNode = NodeFactory.functionDeclarationNode('test', [], functionDeclarationBlockStatementNode);
- programNode = NodeFactory.programNode([
- functionDeclarationNode
- ]);
- programNode.parentNode = programNode;
- functionDeclarationNode.parentNode = programNode;
- functionDeclarationBlockStatementNode.parentNode = functionDeclarationNode;
- expressionStatementNode1.parentNode = functionDeclarationBlockStatementNode;
- ifStatementNode1.parentNode = functionDeclarationBlockStatementNode;
- ifStatementBlockStatementNode1.parentNode = ifStatementNode1;
- ifStatementNode2.parentNode = ifStatementBlockStatementNode1;
- ifStatementBlockStatementNode2.parentNode = ifStatementNode2;
- expressionStatementNode3.parentNode = ifStatementBlockStatementNode2;
- });
- it('should return lexical scope node for `program` node child node', () => {
- assert.deepEqual(NodeLexicalScopeUtils.getLexicalScope(programNode), programNode);
- });
- it('should return lexical scope node for `functionDeclaration` node child node', () => {
- assert.deepEqual(NodeLexicalScopeUtils.getLexicalScope(functionDeclarationNode), functionDeclarationNode);
- });
- it('should return lexical scope node for `functionDeclaration blockStatement` node child node', () => {
- assert.deepEqual(NodeLexicalScopeUtils.getLexicalScope(functionDeclarationBlockStatementNode), functionDeclarationNode);
- });
- it('should return lexical scope node for `expressionStatement` node #1 child node', () => {
- assert.deepEqual(NodeLexicalScopeUtils.getLexicalScope(expressionStatementNode1), functionDeclarationNode);
- });
- it('should return lexical scope node for `ifStatement` node child node', () => {
- assert.deepEqual(NodeLexicalScopeUtils.getLexicalScope(ifStatementNode1), functionDeclarationNode);
- });
- it('should return lexical scope node for `ifStatement blockStatement` node #1 child node', () => {
- assert.deepEqual(NodeLexicalScopeUtils.getLexicalScope(ifStatementBlockStatementNode1), functionDeclarationNode);
- });
- it('should return lexical scope node for `ifStatement blockStatement` node #2 child node', () => {
- assert.deepEqual(NodeLexicalScopeUtils.getLexicalScope(ifStatementBlockStatementNode2), functionDeclarationNode);
- });
- it('should return lexical scope node for `expressionStatement` node #3 child node', () => {
- assert.deepEqual(NodeLexicalScopeUtils.getLexicalScope(expressionStatementNode3), functionDeclarationNode);
- });
- it('should throw a `ReferenceError` if node has no `parentNode` property', () => {
- assert.throws(() => NodeLexicalScopeUtils.getLexicalScope(expressionStatementNode2), ReferenceError);
- });
- });
- describe('getParentScopes', () => {
- let functionDeclarationBlockStatementNode: ESTree.BlockStatement,
- ifStatementBlockStatementNode1: ESTree.BlockStatement,
- ifStatementBlockStatementNode2: ESTree.BlockStatement,
- ifStatementNode1: ESTree.IfStatement,
- ifStatementNode2: ESTree.IfStatement,
- expressionStatementNode3: ESTree.ExpressionStatement,
- expressionStatementNode2: ESTree.ExpressionStatement,
- expressionStatementNode1: ESTree.ExpressionStatement,
- functionDeclarationNode: ESTree.FunctionDeclaration,
- programNode: ESTree.Program;
- before(() => {
- expressionStatementNode1 = NodeFactory.expressionStatementNode(NodeFactory.identifierNode('identifier'));
- expressionStatementNode2 = NodeFactory.expressionStatementNode(NodeFactory.identifierNode('identifier'));
- expressionStatementNode3 = NodeFactory.expressionStatementNode(NodeFactory.identifierNode('identifier'));
- ifStatementBlockStatementNode2 = NodeFactory.blockStatementNode([
- expressionStatementNode2,
- expressionStatementNode3
- ]);
- ifStatementNode2 = NodeFactory.ifStatementNode(
- NodeFactory.literalNode(true),
- ifStatementBlockStatementNode2
- );
- ifStatementBlockStatementNode1 = NodeFactory.blockStatementNode([
- ifStatementNode2
- ]);
- ifStatementNode1 = NodeFactory.ifStatementNode(
- NodeFactory.literalNode(true),
- ifStatementBlockStatementNode1
- );
- functionDeclarationBlockStatementNode = NodeFactory.blockStatementNode([
- expressionStatementNode1,
- ifStatementNode1
- ]);
- functionDeclarationNode = NodeFactory.functionDeclarationNode('test', [], functionDeclarationBlockStatementNode);
- programNode = NodeFactory.programNode([
- functionDeclarationNode
- ]);
- programNode.parentNode = programNode;
- functionDeclarationNode.parentNode = programNode;
- functionDeclarationBlockStatementNode.parentNode = functionDeclarationNode;
- expressionStatementNode1.parentNode = functionDeclarationBlockStatementNode;
- ifStatementNode1.parentNode = functionDeclarationBlockStatementNode;
- ifStatementBlockStatementNode1.parentNode = ifStatementNode1;
- ifStatementNode2.parentNode = ifStatementBlockStatementNode1;
- ifStatementBlockStatementNode2.parentNode = ifStatementNode2;
- expressionStatementNode3.parentNode = ifStatementBlockStatementNode2;
- });
- it('should return lexical scope node for `program` node child node', () => {
- assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(programNode)[0], programNode);
- });
- it('should return lexical scope node for `functionDeclaration` node child node #1', () => {
- assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(functionDeclarationNode)[0], functionDeclarationNode);
- });
- it('should return lexical scope node for `functionDeclaration` node child node #2', () => {
- assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(functionDeclarationNode)[1], programNode);
- });
- it('should return lexical scope node for `functionDeclaration blockStatement` node child node #1', () => {
- assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(functionDeclarationBlockStatementNode)[0], functionDeclarationNode);
- });
- it('should return lexical scope node for `expressionStatement` node #1 child node #1', () => {
- assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(expressionStatementNode1)[0], functionDeclarationNode);
- });
- it('should return lexical scope node for `expressionStatement` node #1 child node #2', () => {
- assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(expressionStatementNode1)[1], programNode);
- });
- it('should return lexical scope node for `ifStatement` node child node #1', () => {
- assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(ifStatementNode1)[0], functionDeclarationNode);
- });
- it('should return lexical scope node for `ifStatement` node child node #2', () => {
- assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(ifStatementNode1)[1], programNode);
- });
- it('should return lexical scope node for `ifStatement blockStatement` node #1 child node #1', () => {
- assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(ifStatementBlockStatementNode1)[0], functionDeclarationNode);
- });
- it('should return lexical scope node for `ifStatement blockStatement` node #1 child node #2', () => {
- assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(ifStatementBlockStatementNode1)[1], programNode);
- });
- it('should return lexical scope node for `ifStatement blockStatement` node #2 child node #1', () => {
- assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(ifStatementBlockStatementNode2)[0], functionDeclarationNode);
- });
- it('should return lexical scope node for `ifStatement blockStatement` node #1 child node #2', () => {
- assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(ifStatementBlockStatementNode2)[1], programNode);
- });
- it('should return lexical scope node for `expressionStatement` node #3 child node #1', () => {
- assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(expressionStatementNode3)[0], functionDeclarationNode);
- });
- it('should return lexical scope node for `expressionStatement` node #3 child node #2', () => {
- assert.deepEqual(NodeLexicalScopeUtils.getLexicalScopes(expressionStatementNode3)[1], programNode);
- });
- it('should throw a `ReferenceError` if node has no `parentNode` property', () => {
- assert.throws(() => NodeLexicalScopeUtils.getLexicalScopes(expressionStatementNode2)[0], ReferenceError);
- });
- });
- });
|