redeyed-function-config-skipping-tokens.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. 'use strict';
  2. /*jshint asi: true*/
  3. var test = require('tap').test
  4. , util = require('util')
  5. , redeyed = require('..')
  6. function inspect (obj) {
  7. return util.inspect(obj, false, 5, true)
  8. }
  9. test('given i skip 2 more tokens after each semicolon', function (t) {
  10. var calls = 0
  11. , opts = {
  12. Punctuator: {
  13. ';': function identity (s, info) {
  14. // tell it to skip past second to last token that is 2 ahead of the current one
  15. calls++
  16. var skipToken = info.tokens[info.tokenIndex + 2]
  17. return skipToken ? { replacement: s, skipPastToken: skipToken } : s;
  18. }
  19. }
  20. }
  21. ;
  22. [ { code: ';;;' , expectedCalls: 1 }
  23. , { code: ';;;;' , expectedCalls: 2 }
  24. , { code: '; ; ; ;' , expectedCalls: 2 }
  25. , { code: ';;; ;;; ;;; ;' , expectedCalls: 4 }
  26. , { code: ';;; ;;; ;;; ;;; ;' , expectedCalls: 5 }
  27. , { code: ';;; ;;; ;;; ;;; ;;;' , expectedCalls: 5 }
  28. , { code: ';;; ;;; ;;; ;;; ;;; ;' , expectedCalls: 6 }
  29. ].forEach(function (x) {
  30. calls = 0
  31. redeyed(x.code, opts);
  32. t.equals(calls, x.expectedCalls, 'calls ' + x.expectedCalls + ' times for ' + x.code)
  33. });
  34. t.end()
  35. })
  36. test('replace log', function (t) {
  37. var kinds = [ 'info', 'warn', 'error' ]
  38. , opts = {
  39. Identifier: {
  40. console: function replaceLog(s, info) {
  41. var code = info.code
  42. , idx = info.tokenIndex
  43. , tokens = info.tokens
  44. , kind = tokens[idx + 2].value
  45. , openParen = tokens[idx + 3].value
  46. , firstArgTkn = tokens[idx + 4]
  47. , argIdx = idx + 3
  48. , open
  49. , tkn
  50. ;
  51. open = 1;
  52. while (open) {
  53. tkn = tokens[++argIdx];
  54. if (tkn.value === '(') open++;
  55. if (tkn.value === ')') open--;
  56. }
  57. var argsIncludingClosingParen = code.slice(firstArgTkn.range[0], tkn.range[1])
  58. , result = 'log.' + kind + '("main-logger", ' + argsIncludingClosingParen;
  59. return { replacement: result, skipPastToken: tkn };
  60. }
  61. }
  62. }
  63. , origCode = [
  64. 'console.info("info ", 1);'
  65. , 'console.warn("warn ", 3);'
  66. , 'console.error("error ", new Error("oh my!"));'
  67. ].join('\n')
  68. , expectedCode = [
  69. 'log.info("main-logger", "info ", 1));'
  70. , 'log.warn("main-logger", "warn ", 3));'
  71. , 'log.error("main-logger", "error ", new Error("oh my!")));'
  72. ].join('\n')
  73. , code = redeyed(origCode, opts).code
  74. t.equals(code, expectedCode, 'transforms all log statements')
  75. t.end()
  76. });