<!DOCTYPE html>
<meta charset="utf-8" />
<title>CSS Logical Properties: computed style listing</title>
<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com" />
<link rel="help" href="https://drafts.csswg.org/css-logical/#margin-properties">
<meta name="assert" content="This test checks that the logical properties are properly exposed in a computed CSSStyleDeclaration." />
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>

<div id="log"></div>

<script>
function hasProperty(object, property) {
  // This checks the [[HasProperty]] internal method.
  return property in object;
}

function hasPropertyValue(object, property) {
  // This checks the [[Get]] internal method.
  return object[property] !== undefined;
}

function hasPropertyDescriptor(object, property) {
  // This checks [[GetOwnProperty]], iterating the prototype chain.
  while (object) {
    if (Reflect.getOwnPropertyDescriptor(object, property)) {
      return true;
    }
    object = Reflect.getPrototypeOf(object);
  }
  return false;
}

function hasPropertyKey(object, property) {
  // This checks [[OwnPropertyKeys]], iterating the prototype chain.
  while (object) {
    if (Reflect.ownKeys(object).includes(property)) {
      return true;
    }
    object = Reflect.getPrototypeOf(object);
  }
  return false;
}

function hasItem(object, item) {
  // This checks the CSSStyleDeclaration::item WebIDL getter.
  for (let i = 0; i < object.length; ++i) {
    if (object.item(i) === item) {
      return true;
    }
  }
  return false;
}

function check(property) {
  const cs = getComputedStyle(document.body);
  const camelCase = property.replace(/-(.)/g, (_, b) => b.toUpperCase());
  test(function() {
    assert_true(hasProperty(cs, property) || hasProperty(cs, camelCase),
      `The computed style has the property ${property} or ${camelCase}.`);
    assert_true(hasPropertyValue(cs, property) || hasPropertyValue(cs, camelCase),
      `The computed style has a value for for the property ${property} or ${camelCase}.`);
    assert_true(hasPropertyDescriptor(cs, property) || hasPropertyDescriptor(cs, camelCase),
      `The computed style has a property descriptor for ${property} or ${camelCase}.`);
    assert_true(hasPropertyKey(cs, property) || hasPropertyKey(cs, camelCase),
      `The computed style contains ${property} or ${camelCase} in the property list.`);
    assert_true(hasItem(cs, property) || hasItem(cs, camelCase),
      `The computed style contains the item ${property} or ${camelCase}.`);
  }, property);
}

check("border-block-end-color");
check("border-block-end-style");
check("border-block-end-width");
check("border-block-start-color");
check("border-block-start-style");
check("border-block-start-width");
check("border-inline-end-color");
check("border-inline-end-style");
check("border-inline-end-width");
check("border-inline-start-color");
check("border-inline-start-style");
check("border-inline-start-width");

check("inset-block-start");
check("inset-block-end");
check("inset-inline-start");
check("inset-inline-end");

check("margin-block-start");
check("margin-block-end");
check("margin-inline-start");
check("margin-inline-end");

check("padding-block-start");
check("padding-block-end");
check("padding-inline-start");
check("padding-inline-end");

check("block-size");
check("inline-size");
check("max-block-size");
check("max-inline-size");
check("min-block-size");
check("min-inline-size");
</script>
