<!DOCTYPE HTML>
<html>
<head>
  <title>deleteCaption()</title>
  <link rel="author" title="Ben Boyle" href="mailto:benjamins.boyle@gmail.com">
  <link rel="help" href="https://html.spec.whatwg.org/multipage/#dom-table-deletecaption" />
  <script src="/resources/testharness.js"></script>
  <script src="/resources/testharnessreport.js"></script>
</head>
<body>
  <table id="one-caption">
    <caption>Fixture table caption</caption>
  </table>

  <table id="two-captions">
    <caption>Fixture table caption</caption>
    <caption>A second caption element</caption>
  </table>

  <table id="zero-captions"></table>

  <table id="descendent-caption">
    <tr>
      <td>
        <table>
          <caption>Nested caption</caption>
        </table>
      </td>
    </tr>
  </table>

  <script>
  // The deleteCaption() method must remove the first caption element child of the table element, if any.
  // https://html.spec.whatwgorg/multipage/tables.html#dom-table-deletecaption
  test(function() {
    var table = document.getElementById('one-caption');

    table.deleteCaption();
    assert_equals(table.getElementsByTagName('caption').length, 0, 'caption was removed');

  }, 'deleteCaption() delete only caption on table');

  test(function() {
    var table = document.getElementById('one-caption');
    var result;

    result = table.deleteCaption();
    // does .deleteCaption() have a return value?
    assert_equals(result, undefined, '.deleteCaption() returns undefined');
  }, 'deleteCaption() returns undefined');

  test(function() {
    var table = document.getElementById('two-captions');

    table.deleteCaption();
    assert_equals(table.getElementsByTagName('caption').length, 1, '1 caption (of 2) was removed');
    assert_equals(table.getElementsByTagName('caption')[0].textContent, 'A second caption element', 'The first caption was removed');

    // removing the only caption
    table.deleteCaption();
    assert_equals(table.getElementsByTagName('caption').length, 0, 'last caption was removed');
  }, 'deleteCaption()');

  test(function() {
    var table = document.getElementById('zero-captions');
    // removing a caption when none exists
    table.deleteCaption();

    assert_equals(table.getElementsByTagName('caption').length, 0, 'no exceptions using .deleteCaption() on a table without any captions');

  }, 'deleteCaption() does not throw any exceptions when called on a table without a caption');

  test(function() {
    var table = document.getElementById( 'descendent-caption' );
    table.deleteCaption();

    assert_equals(table.getElementsByTagName('caption').length, 1, 'descendent caption was not deleted');
  }, 'deleteCaption() does not delete captions in descendent tables');

  test(function() {
    var table = document.getElementById('zero-captions');
    var caption;

    caption = document.createElementNS('http://www.w3.org/2000/svg', 'caption');
    table.insertBefore(caption, table.firstChild);
    assert_equals(table.getElementsByTagName('caption').length, 1, 'SVG:caption is created');

    table.deleteCaption();
    assert_equals(table.getElementsByTagName('caption').length, 1, 'SVG:caption is not deleted');

  }, 'deleteCaption() handles captions from different namespaces');
</script>
</body>
</html>
