| asynctest(
  'tinymce.plugins.paste.browser.ProcessFiltersTest',
  [
    'ephox.agar.api.Assertions',
    'ephox.agar.api.Chain',
    'ephox.agar.api.Logger',
    'ephox.agar.api.Pipeline',
    'ephox.katamari.api.Fun',
    'ephox.mcagar.api.TinyLoader',
    'tinymce.plugins.paste.core.ProcessFilters',
    'tinymce.plugins.paste.Plugin',
    'tinymce.themes.modern.Theme'
  ],
  function (Assertions, Chain, Logger, Pipeline, Fun, TinyLoader, ProcessFilters, PastePlugin, Theme) {
    var success = arguments[arguments.length - 2];
    var failure = arguments[arguments.length - 1];
    Theme();
    PastePlugin();
    var cProcessPre = function (html, internal, preProcess) {
      return Chain.mapper(function (editor) {
        editor.on('PastePreProcess', preProcess);
        var result = ProcessFilters.process(editor, html, internal);
        editor.off('PastePreProcess', preProcess);
        return result;
      });
    };
    var cProcessPrePost = function (html, internal, preProcess, postProcess) {
      return Chain.mapper(function (editor) {
        editor.on('PastePreProcess', preProcess);
        editor.on('PastePostProcess', postProcess);
        var result = ProcessFilters.process(editor, html, internal);
        editor.off('PastePreProcess', preProcess);
        editor.off('PastePostProcess', postProcess);
        return result;
      });
    };
    var preventHandler = function (e) {
      e.preventDefault();
    };
    var preProcessHandler = function (e) {
      e.content += 'X';
    };
    var postProcessHandler = function (editor) {
      return function (e) {
        editor.dom.remove(editor.dom.select('b', e.node), true);
      };
    };
    var assertInternal = function (expectedFlag) {
      return function (e) {
        Assertions.assertEq('Should be expected internal flag', expectedFlag, e.internal);
      };
    };
    TinyLoader.setup(function (editor, onSuccess, onFailure) {
      Pipeline.async({}, [
        Logger.t('Paste pre process only', Chain.asStep(editor, [
          cProcessPre('a', true, preProcessHandler),
          Assertions.cAssertEq('Should be preprocessed by adding a X', { content: 'aX', cancelled: false })
        ])),
        Logger.t('Paste pre/post process passthough as is', Chain.asStep(editor, [
          cProcessPrePost('a', true, Fun.noop, Fun.noop),
          Assertions.cAssertEq('Should be unchanged', { content: 'a', cancelled: false })
        ])),
        Logger.t('Paste pre/post process assert internal false', Chain.asStep(editor, [
          cProcessPrePost('a', false, assertInternal(false), assertInternal(false)),
          Assertions.cAssertEq('Should be unchanged', { content: 'a', cancelled: false })
        ])),
        Logger.t('Paste pre/post process assert internal true', Chain.asStep(editor, [
          cProcessPrePost('a', true, assertInternal(true), assertInternal(true)),
          Assertions.cAssertEq('Should be unchanged', { content: 'a', cancelled: false })
        ])),
        Logger.t('Paste pre/post process alter on preprocess', Chain.asStep(editor, [
          cProcessPrePost('a', true, preProcessHandler, Fun.noop),
          Assertions.cAssertEq('Should be preprocessed by adding a X', { content: 'aX', cancelled: false })
        ])),
        Logger.t('Paste pre/post process alter on postprocess', Chain.asStep(editor, [
          cProcessPrePost('a<b>b</b>c', true, Fun.noop, postProcessHandler(editor)),
          Assertions.cAssertEq('Should have all b elements removed', { content: 'abc', cancelled: false })
        ])),
        Logger.t('Paste pre/post process alter on preprocess/postprocess', Chain.asStep(editor, [
          cProcessPrePost('a<b>b</b>c', true, preProcessHandler, postProcessHandler(editor)),
          Assertions.cAssertEq('Should have all b elements removed and have a X added', { content: 'abcX', cancelled: false })
        ])),
        Logger.t('Paste pre/post process prevent default on preProcess', Chain.asStep(editor, [
          cProcessPrePost('a<b>b</b>c', true, preventHandler, postProcessHandler(editor)),
          Assertions.cAssertEq('Should have all b elements removed and be cancelled', { content: 'a<b>b</b>c', cancelled: true })
        ])),
        Logger.t('Paste pre/post process prevent default on postProcess', Chain.asStep(editor, [
          cProcessPrePost('a<b>b</b>c', true, preProcessHandler, preventHandler),
          Assertions.cAssertEq('Should have a X added and be cancelled', { content: 'a<b>b</b>cX', cancelled: true })
        ]))
      ], onSuccess, onFailure);
    }, {
      add_unload_trigger: false,
      indent: false,
      plugins: 'paste',
      skin_url: '/project/src/skins/lightgray/dist/lightgray'
    }, success, failure);
  }
);
 |