FunctionDeclarationObfuscator.spec.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import { IBlockStatementNode } from "../../../src/interfaces/nodes/IBlockStatementNode";
  2. import { ICustomNode } from "../../../src/interfaces/ICustomNode";
  3. import { IExpressionStatementNode } from "../../../src/interfaces/nodes/IExpressionStatementNode";
  4. import { IFunctionDeclarationNode } from "../../../src/interfaces/nodes/IFunctionDeclarationNode";
  5. import { IProgramNode } from "../../../src/interfaces/nodes/IProgramNode";
  6. import { DEFAULT_PRESET } from "../../../src/preset-options/DefaultPreset";
  7. import { FunctionDeclarationObfuscator } from '../../../src/node-obfuscators/FunctionDeclarationObfuscator';
  8. import { NodeMocks } from "../../mocks/NodeMocks";
  9. import { Options } from "../../../src/Options";
  10. const assert: Chai.AssertStatic = require('chai').assert;
  11. describe('FunctionDeclarationObfuscator', () => {
  12. describe('obfuscateNode (functionDeclarationNode: IFunctionDeclarationNode, parentNode: INode): void', () => {
  13. let expressionStatementNode: IExpressionStatementNode,
  14. functionDeclarationObfuscator: FunctionDeclarationObfuscator,
  15. functionDeclarationNode: IFunctionDeclarationNode,
  16. functionName: string = 'functionDeclaration',
  17. programNode: IProgramNode;
  18. beforeEach(() => {
  19. expressionStatementNode = NodeMocks.getExpressionStatementNode(
  20. NodeMocks.getCallExpressionNode(NodeMocks.getIdentifierNode(functionName))
  21. );
  22. functionDeclarationObfuscator = new FunctionDeclarationObfuscator(
  23. new Map<string, ICustomNode>(),
  24. new Options(DEFAULT_PRESET)
  25. );
  26. functionDeclarationNode = NodeMocks.getFunctionDeclarationNode(
  27. functionName,
  28. NodeMocks.getBlockStatementNode()
  29. );
  30. });
  31. describe('if `functionDeclaration` node parent node is not a Program node', () => {
  32. let blockStatementNode: IBlockStatementNode,
  33. functionDeclarationParentNode: IFunctionDeclarationNode;
  34. beforeEach(() => {
  35. blockStatementNode = NodeMocks.getBlockStatementNode([
  36. functionDeclarationNode,
  37. expressionStatementNode
  38. ]);
  39. functionDeclarationParentNode = NodeMocks.getFunctionDeclarationNode(
  40. 'functionDeclarationParentNode',
  41. blockStatementNode
  42. );
  43. programNode = NodeMocks.getProgramNode([
  44. functionDeclarationParentNode
  45. ]);
  46. programNode['parentNode'] = programNode;
  47. functionDeclarationParentNode['parentNode'] = programNode;
  48. blockStatementNode['parentNode'] = functionDeclarationParentNode;
  49. functionDeclarationNode['parentNode'] = blockStatementNode;
  50. expressionStatementNode['parentNode'] = blockStatementNode;
  51. functionDeclarationObfuscator.obfuscateNode(
  52. functionDeclarationNode,
  53. functionDeclarationNode['parentNode']
  54. );
  55. });
  56. it('should obfuscate function name', () => {
  57. assert.match(functionDeclarationNode.id.name, /^_0x\w+$/);
  58. });
  59. it('should obfuscate function name inside `functionDeclaration` parent scope', () => {
  60. assert.match((<any>expressionStatementNode).expression.callee.name, /^_0x\w+$/);
  61. });
  62. });
  63. describe('if `functionDeclaration` node parent node is a Program node', () => {
  64. beforeEach(() => {
  65. programNode = NodeMocks.getProgramNode([
  66. functionDeclarationNode
  67. ]);
  68. functionDeclarationNode['parentNode'] = programNode;
  69. expressionStatementNode['parentNode'] = programNode;
  70. functionDeclarationObfuscator.obfuscateNode(
  71. functionDeclarationNode,
  72. functionDeclarationNode['parentNode']
  73. );
  74. });
  75. it('shouldn\'t obfuscate function name inside `programNode` scope', () => {
  76. assert.equal(functionDeclarationNode.id.name, functionName);
  77. });
  78. it('should\'t obfuscate function name in `functionDeclaration` calls inside `programNode`', () => {
  79. assert.equal((<any>expressionStatementNode).expression.callee.name, functionName);
  80. });
  81. });
  82. });
  83. });