<!DOCTYPE html>
<title>CSSOM test: declaration block after setting via CSSOM</title>
<link rel="help" href="https://drafts.csswg.org/cssom/#set-a-css-declaration-value">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<div id="test"></div>
<script>
  test(function() {
    const PHYSICAL_PROPS = ["padding-top", "padding-right",
                            "padding-bottom", "padding-left"];
    const LOGICAL_PROPS = ["padding-block-start", "padding-block-end",
                           "padding-inline-start", "padding-inline-end"];
    let elem = document.getElementById("test");
    let decls = new Map;

    {
      let css = []
      let i = 0;
      for (let name of [...PHYSICAL_PROPS, ...LOGICAL_PROPS]) {
        let value = `${i++}px`;
        css.push(`${name}: ${value};`);
        decls.set(name, value);
      }
      elem.setAttribute("style", css.join(" "));
    }

    let style = elem.style;
    function indexOfProperty(prop) {
      return Array.prototype.indexOf.apply(style, [prop]);
    }
    function assertPropAfterProps(prop, props, msg) {
      let index = indexOfProperty(prop);
      for (let p of props) {
        assert_less_than(indexOfProperty(p), index, `${prop} should be after ${p} ${msg}`);
      }
    }
    // We are not changing any value in this test, just order.
    function assertValueUnchanged() {
      for (let [name, value] of decls.entries()) {
        assert_equals(style.getPropertyValue(name), value,
                      `value of ${name} shouldn't be changed`);
      }
    }

    assertValueUnchanged();
    // Check that logical properties are all after physical properties
    // at the beginning.
    for (let p of LOGICAL_PROPS) {
      assertPropAfterProps(p, PHYSICAL_PROPS, "initially");
    }

    // Try setting a longhand.
    style.setProperty("padding-top", "0px");
    assertValueUnchanged();
    // Check that padding-top is after logical properties, but other
    // physical properties are still before logical properties.
    assertPropAfterProps("padding-top", LOGICAL_PROPS, "after setting padding-top");
    for (let p of LOGICAL_PROPS) {
      assertPropAfterProps(p, PHYSICAL_PROPS.filter(prop => prop != "padding-top"),
                           "after setting padding-top");
    }

    // Try setting a shorthand.
    style.setProperty("padding", "0px 1px 2px 3px");
    assertValueUnchanged();
    // Check that all physical properties are now after logical properties.
    for (let p of PHYSICAL_PROPS) {
      assertPropAfterProps(p, LOGICAL_PROPS, "after setting padding shorthand");
    }
  }, "newly set declaration should be after all declarations " +
  "in the same logical property group but have different logical kind");
</script>
