redeyed-function-config-skipping-tokens.js 2.8 KB
'use strict';
/*jshint asi: true*/

var test = require('tap').test
  , util = require('util')
  , redeyed = require('..')

function inspect (obj) {
  return util.inspect(obj, false, 5, true)
}

          
test('given i skip 2 more tokens after each semicolon', function (t) {
  var calls = 0
    , opts = {
        Punctuator: {
          ';':  function identity (s, info) {
                  // tell it to skip past second to last token that is 2 ahead of the current one
                  calls++
                  var skipToken = info.tokens[info.tokenIndex + 2]
                  return skipToken ? { replacement: s, skipPastToken: skipToken } : s;
                }
        }
      }
    ;

  [  { code: ';;;'                   ,  expectedCalls: 1 }
  ,  { code: ';;;;'                  ,  expectedCalls: 2 }
  ,  { code: '; ; ; ;'               ,  expectedCalls: 2 }
  ,  { code: ';;; ;;; ;;; ;'         ,  expectedCalls: 4 }
  ,  { code: ';;; ;;; ;;; ;;; ;'     ,  expectedCalls: 5 }
  ,  { code: ';;; ;;; ;;; ;;; ;;;'   ,  expectedCalls: 5 }
  ,  { code: ';;; ;;; ;;; ;;; ;;; ;' ,  expectedCalls: 6 }
  ].forEach(function (x) {
      calls = 0
      redeyed(x.code, opts);
      t.equals(calls, x.expectedCalls, 'calls ' + x.expectedCalls + ' times for ' + x.code)
    });
  t.end()
})

test('replace log', function (t) {
  var kinds = [ 'info', 'warn', 'error' ]
    , opts = {
        Identifier: { 
          console: function replaceLog(s, info) {
            var code        =  info.code
              , idx         =  info.tokenIndex
              , tokens      =  info.tokens
              , kind        =  tokens[idx + 2].value
              , openParen   =  tokens[idx + 3].value
              , firstArgTkn =  tokens[idx + 4]
              , argIdx      =  idx + 3
              , open
              , tkn
              ;

            open = 1;
            while (open) {
              tkn = tokens[++argIdx];

              if (tkn.value === '(') open++;
              if (tkn.value === ')') open--;
            }

            var argsIncludingClosingParen =  code.slice(firstArgTkn.range[0], tkn.range[1])
              , result                    =  'log.' + kind + '("main-logger", ' + argsIncludingClosingParen;
            
            return { replacement: result, skipPastToken: tkn }; 
          }
        }
      }

   , origCode = [
       'console.info("info ", 1);'
     , 'console.warn("warn ", 3);'
     , 'console.error("error ", new Error("oh my!"));'
    ].join('\n')
  
  , expectedCode = [
      'log.info("main-logger", "info ", 1));'
    , 'log.warn("main-logger", "warn ", 3));'
    , 'log.error("main-logger", "error ", new Error("oh my!")));'
    ].join('\n')
  , code = redeyed(origCode, opts).code

  t.equals(code, expectedCode, 'transforms all log statements')
  t.end()
});