| asynctest(
  'browser.tinymce.core.dom.PaddingBrTest',
  [
    'ephox.agar.api.Assertions',
    'ephox.agar.api.GeneralSteps',
    'ephox.agar.api.Logger',
    'ephox.agar.api.Pipeline',
    'ephox.agar.api.Step',
    'ephox.sugar.api.node.Element',
    'ephox.sugar.api.properties.Html',
    'tinymce.core.dom.Empty',
    'tinymce.core.dom.PaddingBr'
  ],
  function (Assertions, GeneralSteps, Logger, Pipeline, Step, Element, Html, Empty, PaddingBr) {
    var success = arguments[arguments.length - 2];
    var failure = arguments[arguments.length - 1];
    var sTestRemoveTrailingBr = function (label, inputHtml, expectedHtml) {
      return Step.sync(function () {
        var elm = Element.fromHtml(inputHtml);
        PaddingBr.removeTrailingBr(elm);
        Assertions.assertHtml(label, expectedHtml, Html.getOuter(elm));
      });
    };
    var sTestTrimBlockTrailingBr = function (label, inputHtml, expectedHtml) {
      return Step.sync(function () {
        var elm = Element.fromHtml(inputHtml);
        PaddingBr.trimBlockTrailingBr(elm);
        Assertions.assertHtml(label, expectedHtml, Html.getOuter(elm));
      });
    };
    Pipeline.async({}, [
      Logger.t('removeTrailingBrs', GeneralSteps.sequence([
        sTestRemoveTrailingBr('Should be untouched since it has no brs', '<p>a</p>', '<p>a</p>'),
        sTestRemoveTrailingBr('Should be untouched since the br not at the edge of the tree', '<p>a<br>b</p>', '<p>a<br>b</p>'),
        sTestRemoveTrailingBr('Should be untouched since the br not at the edge of the tree', '<p><b>a<br></b>b</p>', '<p><b>a<br></b>b</p>'),
        sTestRemoveTrailingBr('Should remove trailing br 1', '<p>a<br></p>', '<p>a</p>'),
        sTestRemoveTrailingBr('Should remove trailing br 2', '<p><b>a<br></b></p>', '<p><b>a</b></p>'),
        sTestRemoveTrailingBr('Should remove trailing br 3', '<p><i><b>a<br></b></i></p>', '<p><i><b>a</b></i></p>'),
        sTestRemoveTrailingBr('Should remove trailing br 4', '<p><b>a</b><br></p>', '<p><b>a</b></p>'),
        sTestRemoveTrailingBr('Should be untouched since there is more than one br', '<p>a<br><br></p>', '<p>a<br><br></p>'),
        sTestRemoveTrailingBr('Should be untouched since there is more than one br', '<p><b>a<br></b><br></p>', '<p><b>a<br></b><br></p>')
      ])),
      Logger.t('fillWithPaddingBr', GeneralSteps.sequence([
        Step.sync(function () {
          var elm = Element.fromHtml('<p>a</p>');
          PaddingBr.fillWithPaddingBr(elm);
          Assertions.assertHtml('Should be padded with bogus br', '<p><br data-mce-bogus="1"></p>', Html.getOuter(elm));
        })
      ])),
      Logger.t('isPaddedElement', Step.sync(function () {
        Assertions.assertEq('Should not be padded', false, PaddingBr.isPaddedElement(Element.fromHtml('<p>a</p>')));
        Assertions.assertEq('Should not be padded', false, PaddingBr.isPaddedElement(Element.fromHtml('<p>\u00a0\u00a0</p>')));
        Assertions.assertEq('Should not be padded', false, PaddingBr.isPaddedElement(Element.fromHtml('<p><br><br></p>')));
        Assertions.assertEq('Should not be padded', false, PaddingBr.isPaddedElement(Element.fromHtml('<p></p>')));
        Assertions.assertEq('Should be padded nbsp', true, PaddingBr.isPaddedElement(Element.fromHtml('<p>\u00a0</p>')));
        Assertions.assertEq('Should be padded br', true, PaddingBr.isPaddedElement(Element.fromHtml('<p><br></p>')));
      })),
      Logger.t('trimPaddingBrs', GeneralSteps.sequence([
        sTestTrimBlockTrailingBr('Should be untouched since it has no brs', '<div></div>', '<div></div>'),
        sTestTrimBlockTrailingBr('Should be untouched since it has no brs', '<div><p>a</p></div>', '<div><p>a</p></div>'),
        sTestTrimBlockTrailingBr('Should be without br since it is after a block', '<div><p>a</p><br></div>', '<div><p>a</p></div>'),
        sTestTrimBlockTrailingBr('Should be untouched since it is multiple brs', '<div><p>a</p><br><br></div>', '<div><p>a</p><br><br></div>'),
        sTestTrimBlockTrailingBr('Should be untouched since it is br after a inline', '<div><b>a</b><br></div>', '<div><b>a</b><br></div>'),
        sTestTrimBlockTrailingBr('Should be untouched since it is br after inlide inline', '<span><b>a</b><br></span>', '<span><b>a</b><br></span>')
      ]))
    ], function () {
      success();
    }, failure);
  }
);
 |