<!doctype html>
<meta charset=utf-8>
<title>client* properties on tables</title>
<link rel="help" href="https://drafts.csswg.org/cssom-view/#extension-to-the-element-interface">
<script src=../../../../../resources/testharness.js></script>
<script src=../../../../../resources/testharnessreport.js></script>
<div id="test-target" style="position: absolute"></div>
<script>
  test(function() {
    // Each test consists of four elements: the markup to use, the expected
    // value of offsetWidth on the table, the expected value of offsetHeight
    // on the table, and the description string.
    var tests = [
      [ `<table style="width: 20px; height: 30px">`,
        20, 30,
        "Basic table" ],
      [ `<table><caption style="width: 40px; height: 50px">`,
        40, 50,
        "Basic caption" ],
      [ `<table style="width: 20px; height: 30px">
           <caption style="width: 10px; height: 20px">`,
        20, 50,
        "Table and narrower caption" ],
      [ `<table style="width: 20px; height: 30px">
           <caption style="width: 40px; height: 20px">`,
        40, 50,
        "Table and wider caption" ],
      [ `<table style="width: 20px; height: 30px; padding: 1px 2px 3px 4px">`,
        20, 30,
        "Table with padding" ],
      [ `<table style="width: 20px; height: 30px; padding: 1px 2px 3px 4px;
                       box-sizing: content-box">`,
        26, 34,
        "Table with padding and content-box sizing" ],
      [ `<table style="width: 20px; height: 30px;
                       border-width: 1px 2px 3px 4px; border-style: solid;
                       border-collapse: separate; box-sizing: content-box">`,
        26, 34,
        "Table with separated border" ],
      [ `<table style="width: 20px; height: 30px;
                       border-width: 2px 4px 6px 8px; border-style: solid;
                       border-collapse: collapse; box-sizing: content-box">
           <tr><td>`,
        26, 34,
        "Table with collapsed border" ],
      [ `<table>
           <caption style="width: 40px; height: 50px; padding: 1px 2px 3px 4px">`,
        46, 54,
        "Caption with padding" ],
      [ `<table>
           <caption style="width: 40px; height: 50px;
                           border-width: 1px 2px 3px 4px; border-style: solid">`,
        46, 54,
        "Caption with border" ],
      [ `<table>
           <caption style="width: 40px; height: 50px; margin: 1px 2px 3px 4px;">`,
        46, 54,
        "Caption with margin" ],
      [ `<table style="caption-side: bottom">
           <caption style="width: 40px; height: 50px;">`,
        40, 50,
        "Bottom caption" ],
    ];

    function target() {
      return document.getElementById("test-target");
    }

    function table() {
      return target().querySelector("table");
    }

    for (var t of tests) {
      test(function() {
        target().innerHTML = t[0];
        assert_equals(table().clientWidth, t[1], t[3] + " clientWidth");
        assert_equals(table().clientHeight, t[2], t[3] + " clientHeight");
        assert_equals(table().clientLeft, 0, t[3] + " clientLeft");
        assert_equals(table().clientTop, 0, t[3] + " clientTop");
      }, t[3]);
    }
  }, "Overall test to make sure there are no exceptions");
</script>
