<!doctype html>
<meta charset=utf-8>
<title>HTMLTableElement.createTBody</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<div id=log></div>
<script>
function assert_tbody(tbody) {
  assert_equals(tbody.localName, "tbody");
  assert_equals(tbody.namespaceURI, htmlNS);
  assert_equals(tbody.prefix, null);
}
var htmlNS = "http://www.w3.org/1999/xhtml";
test(function() {
  var table = document.createElement("table");
  var tbody = table.createTBody();
  assert_equals(table.firstChild, tbody);
  assert_tbody(tbody);
}, "No child nodes");

test(function() {
  var table = document.createElement("table");
  var before = table.appendChild(document.createElement("tbody"));
  assert_array_equals(table.childNodes, [before]);

  var tbody = table.createTBody();
  assert_array_equals(table.childNodes, [before, tbody]);
  assert_tbody(tbody);
}, "One tbody child node");

test(function() {
  var table = document.createElement("table");
  var before1 = table.appendChild(document.createElement("tbody"));
  var before2 = table.appendChild(document.createElement("tbody"));
  assert_array_equals(table.childNodes, [before1, before2]);

  var tbody = table.createTBody();
  assert_array_equals(table.childNodes, [before1, before2, tbody]);
  assert_tbody(tbody);
}, "Two tbody child nodes");

test(function() {
  var table = document.createElement("table");
  var before1 = table.appendChild(document.createElement("thead"));
  var before2 = table.appendChild(document.createElement("tbody"));
  assert_array_equals(table.childNodes, [before1, before2]);

  var tbody = table.createTBody();
  assert_array_equals(table.childNodes, [before1, before2, tbody]);
  assert_tbody(tbody);
}, "A thead and a tbody child node");

test(function() {
  var table = document.createElement("table");
  var before1 = table.appendChild(document.createElement("tfoot"));
  var before2 = table.appendChild(document.createElement("tbody"));
  assert_array_equals(table.childNodes, [before1, before2]);

  var tbody = table.createTBody();
  assert_array_equals(table.childNodes, [before1, before2, tbody]);
  assert_tbody(tbody);
}, "A tfoot and a tbody child node");

test(function() {
  var table = document.createElement("table");
  var before = table.appendChild(document.createElement("tbody"));
  var after = table.appendChild(document.createElement("thead"));
  assert_array_equals(table.childNodes, [before, after]);

  var tbody = table.createTBody();
  assert_array_equals(table.childNodes, [before, tbody, after]);
  assert_tbody(tbody);
}, "A tbody and a thead child node");

test(function() {
  var table = document.createElement("table");
  var before = table.appendChild(document.createElement("tbody"));
  var after = table.appendChild(document.createElement("tfoot"));
  assert_array_equals(table.childNodes, [before, after]);

  var tbody = table.createTBody();
  assert_array_equals(table.childNodes, [before, tbody, after]);
  assert_tbody(tbody);
}, "A tbody and a tfoot child node");

test(function() {
  var table = document.createElement("table");
  var before1 = table.appendChild(document.createElement("tbody"));
  var before2 = table.appendChild(document.createElement("tbody"));
  var after = table.appendChild(document.createElement("div"));
  assert_array_equals(table.childNodes, [before1, before2, after]);

  var tbody = table.createTBody();
  assert_array_equals(table.childNodes, [before1, before2, tbody, after]);
  assert_tbody(tbody);
}, "Two tbody child nodes and a div");

test(function() {
  var table = document.createElement("table");
  var before = table.appendChild(document.createElement("tbody"));
  var after = table.appendChild(document.createElementNS("x", "tbody"));
  assert_array_equals(table.childNodes, [before, after]);

  var tbody = table.createTBody();
  assert_array_equals(table.childNodes, [before, tbody, after]);
  assert_tbody(tbody);
}, "One HTML and one namespaced tbody child node");

test(function() {
  var table = document.createElement("table");
  var before1 = table.appendChild(document.createElement("tbody"));
  var before2 = before1.appendChild(document.createElement("tbody"));
  assert_array_equals(table.childNodes, [before1]);

  var tbody = table.createTBody();
  assert_array_equals(table.childNodes, [before1, tbody]);
  assert_tbody(tbody);
}, "Two nested tbody child nodes");

test(function() {
  var table = document.createElement("table");
  var before1 = table.appendChild(document.createElement("thead"));
  var before2 = before1.appendChild(document.createElement("tbody"));
  assert_array_equals(table.childNodes, [before1]);

  var tbody = table.createTBody();
  assert_array_equals(table.childNodes, [before1, tbody]);
  assert_tbody(tbody);
}, "A tbody node inside a thead child node");

test(function() {
  var table = document.createElement("table");
  var before1 = table.appendChild(document.createElement("tfoot"));
  var before2 = before1.appendChild(document.createElement("tbody"));
  assert_array_equals(table.childNodes, [before1]);

  var tbody = table.createTBody();
  assert_array_equals(table.childNodes, [before1, tbody]);
  assert_tbody(tbody);
}, "A tbody node inside a tfoot child node");

test(function() {
  var table = document.createElement("table");
  var before = table.appendChild(document.createElement("tbody"));
  var after1 = table.appendChild(document.createElement("thead"));
  var after2 = after1.appendChild(document.createElement("tbody"));
  assert_array_equals(table.childNodes, [before, after1]);

  var tbody = table.createTBody();
  assert_array_equals(table.childNodes, [before, tbody, after1]);
  assert_tbody(tbody);
}, "A tbody node inside a thead child node after a tbody child node");

test(function() {
  var table = document.createElement("table");
  var before = table.appendChild(document.createElement("tbody"));
  var after1 = table.appendChild(document.createElement("tfoot"));
  var after2 = after1.appendChild(document.createElement("tbody"));
  assert_array_equals(table.childNodes, [before, after1]);

  var tbody = table.createTBody();
  assert_array_equals(table.childNodes, [before, tbody, after1]);
  assert_tbody(tbody);
}, "A tbody node inside a tfoot child node after a tbody child node");

test(function() {
  var table = document.createElementNS(htmlNS, "foo:table");
  var tbody = table.createTBody();

  assert_equals(tbody.prefix, null);
}, "A prefixed table creates tbody without prefix");

</script>
