<!DOCTYPE HTML>
<html>
  <head>
    <title>HTML5 Table API Tests</title>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
    <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
    <link rel="help" href="https://html.spec.whatwg.org/multipage/#the-caption-element" />
  </head>
  <script src="/resources/testharness.js"></script>
  <script src="/resources/testharnessreport.js"></script>
  <body>
    <div id="log"></div>
    <table id="table1" style="display:none">
      <tr><td></td></tr>
      <caption>first caption</caption>
      <caption>second caption</caption>
    </table>
    <table id="table2" style="display:none">
      <tr><td></td></tr>
    </table>
    <table id="table3" style="display:none">
      <tr><td></td></tr>
    </table>
    <table id="table4" style="display:none">
      <tr><td></td></tr>
      <caption>first caption</caption>
    </table>
    <script>
      test(function () {
        assert_equals(document.getElementById('table1').caption.innerHTML, "first caption");
      }, "first caption element child of the first table element");

      test(function () {
        var caption = document.createElement("caption");
        caption.innerHTML = "new caption";
        var table = document.getElementById('table1');
        table.caption = caption;

        assert_equals(caption.parentNode, table);
        assert_equals(table.firstChild, caption);
        assert_equals(table.caption.innerHTML, "new caption");

        captions = table.getElementsByTagName('caption');
        assert_equals(captions.length, 2);
        assert_equals(captions[0].innerHTML, "new caption");
        assert_equals(captions[1].innerHTML, "second caption");
      }, "setting caption on a table");

      test(function () {
        assert_equals(document.getElementById('table2').caption, null);
      }, "caption IDL attribute is null");

      test(function () {
        var table = document.getElementById('table3');
        var caption = document.createElement("caption")
        table.rows[0].appendChild(caption);
        assert_equals(table.caption, null);
      }, "caption of the third table element should be null");

      test(function () {
        assert_not_equals(document.getElementById('table4').caption, null);

        var parent = document.getElementById('table4').caption.parentNode;
        parent.removeChild(document.getElementById('table4').caption);

        assert_equals(document.getElementById('table4').caption, null);
      }, "dynamically removing caption on a table");
    </script>
  </body>
</html>
