const createPreviewIframeNode = function (editor, node) {
  let previewWrapper;
  let previewNode;
  let shimNode;
  const name = node.name;

  previewWrapper = new Node('span', 1);
  previewWrapper.attr({
    'contentEditable': 'false',
    'style': node.attr('style'),
    'data-mce-object': name,
    'class': 'mce-preview-object mce-object-' + name
  });

  retainAttributesAndInnerHtml(editor, node, previewWrapper);

  previewNode = new Node(name, 1);
  previewNode.attr({
    src: node.attr('src'),
    allowfullscreen: node.attr('allowfullscreen'),
    width: node.attr('width') || '300',
    height: node.attr('height') || (name === 'audio' ? '30' : '150'),
    frameborder: '0'
  });

  shimNode = new Node('span', 1);
  shimNode.attr('class', 'mce-shim');

  previewWrapper.append(previewNode);
  previewWrapper.append(shimNode);

  return previewWrapper;
};
  suite.test('replace single child', function () {
    let root, node1, node2;

    root = new Node('#frag', 11);
    node1 = root.append(new Node('b', 1));
    node2 = root.append(new Node('em', 1));
    node1.replace(node2);
    ok(root.firstChild === node2, 'root.firstChild');
    ok(root.lastChild === node2, 'root.lastChild');
    ok(node2.parent === root, 'node2.parent');
    ok(!node2.next, 'node2.next');
    ok(!node2.prev, 'node2.prev');
  });
  suite.test('replace middle child', function () {
    let root, node1, node2, node3, node4;

    root = new Node('#frag', 11);
    node1 = root.append(new Node('b', 1));
    node2 = root.append(new Node('b', 1));
    node3 = root.append(new Node('b', 1));
    node4 = root.append(new Node('em', 1));
    node2.replace(node4);
    ok(root.firstChild === node1, 'root.firstChild');
    ok(root.lastChild === node3, 'root.lastChild');
    ok(node4.parent === root, 'node4.parent');
    ok(node4.next === node3, 'node4.next');
    ok(node4.prev === node1, 'node4.prev');
  });
  suite.test('append existing node before other existing node', function () {
    let root, node, node2;

    root = new Node('#frag', 11);
    node = root.append(new Node('a', 1));
    node2 = root.append(new Node('b', 1));
    root.append(node);
    ok(root.firstChild === node2, 'root.firstChild');
    ok(root.lastChild === node, 'root.lastChild');
    LegacyUnit.equal(node.next, null, 'node.next');
    ok(node.prev === node2, 'node.prev');
    ok(node.parent === root, 'node.parent');
    ok(node2.parent === root, 'node2.parent');
    LegacyUnit.equal(node2.prev, undefined, 'node2.prev');
    ok(node2.next === node, 'node2.next');
  });
  suite.test('clone', function () {
    let root, node, clone;

    node = new Node('#text', 3);
    node.value = 'value';
    clone = node.clone();
    LegacyUnit.equal(clone.name, '#text');
    LegacyUnit.equal(clone.type, 3);
    LegacyUnit.equal(clone.value, 'value');
    LegacyUnit.equal(clone.parent, undefined);
    LegacyUnit.equal(clone.next, undefined);
    LegacyUnit.equal(clone.prev, undefined);

    root = new Node('#frag', 11);
    node = new Node('#text', 3);
    node.value = 'value';
    root.append(node);
    LegacyUnit.equal(clone.name, '#text');
    LegacyUnit.equal(clone.type, 3);
    LegacyUnit.equal(clone.value, 'value');
    LegacyUnit.equal(clone.parent, undefined);
    LegacyUnit.equal(clone.next, undefined);
    LegacyUnit.equal(clone.prev, undefined);

    node = new Node('b', 1);
    node.attr('id', 'id');
    node.attr('class', 'class');
    node.attr('title', 'title');
    clone = node.clone();
    LegacyUnit.equal(clone.name, 'b');
    LegacyUnit.equal(clone.type, 1);
    LegacyUnit.deepEqual(clone.attributes, [{ name: 'class', value: 'class' }, { name: 'title', value: 'title' }]);
    LegacyUnit.deepEqual(clone.attributes.map, { class: 'class', title: 'title' });
  });
  suite.test('remove middle node', function () {
    let root, node, node2, node3;

    root = new Node('#frag', 11);
    node = root.append(new Node('a', 1));
    node2 = root.append(new Node('b', 1));
    node3 = root.append(new Node('c', 1));
    node2.remove();
    LegacyUnit.equal(node2.parent, null);
    LegacyUnit.equal(node2.next, null);
    LegacyUnit.equal(node2.prev, null);
    ok(root.firstChild === node, 'root.firstChild');
    ok(root.lastChild === node3, 'root.lastChild');
    ok(node.next === node3, 'node.next');
    LegacyUnit.equal(node.prev, undefined, 'node.prev');
    LegacyUnit.equal(node3.prev === node, true, 'node3.prev');
    LegacyUnit.equal(node3.next, undefined, 'node3.next');
  });
  suite.test('empty', function () {
    let root, node1;

    root = new Node('#frag', 11);
    node1 = root.append(new Node('b', 1));
    node1.empty();
    ok(root.firstChild === node1, 'root.firstChild');
    ok(root.lastChild === node1, 'root.firstChild');
    ok(!node1.firstChild, 'node1.firstChild');
    ok(!node1.lastChild, 'node1.firstChild');
  });
  suite.test('unwrap', function () {
    let root, node1, node2, node3;

    root = new Node('#frag', 11);
    node1 = root.append(new Node('b', 1));
    node2 = node1.append(new Node('em', 1));
    node1.unwrap();
    ok(root.firstChild === node2, 'root.firstChild');
    ok(root.lastChild === node2, 'root.lastChild');
    ok(node2.parent === root, 'node2.parent');

    root = new Node('#frag', 11);
    node1 = root.append(new Node('b', 1));
    node2 = node1.append(new Node('em', 1));
    node3 = node1.append(new Node('span', 1));
    node1.unwrap();
    ok(root.firstChild === node2, 'root.firstChild');
    ok(root.lastChild === node3, 'root.lastChild');
    ok(node2.parent === root, 'node2.parent');
    ok(node3.parent === root, 'node3.parent');
  });
  suite.test('insert after last', function () {
    let fragment, root, node, node2;

    fragment = new Node('#frag', 11);
    root = fragment.append(new Node('body', 1));
    node = root.append(new Node('a', 1));
    node2 = root.insert(new Node('x', 1), node);
    ok(root.firstChild === node, 'root.firstChild');
    ok(root.lastChild === node2, 'root.lastChild');
    ok(node.next === node2, 'node.next');
    ok(node2.prev === node, 'node2.prev');
    ok(node2.parent === root, 'node3.next');
  });
  suite.test('remove single child', function () {
    let root, node;

    root = new Node('#frag', 11);
    node = root.append(new Node('p', 1));
    node = root.firstChild.remove();
    LegacyUnit.equal(root.firstChild, undefined);
    LegacyUnit.equal(root.lastChild, undefined);
    LegacyUnit.equal(node.parent, null);
    LegacyUnit.equal(node.next, null);
    LegacyUnit.equal(node.prev, null);
    LegacyUnit.equal(node.name, 'p');
  });