<!DOCTYPE html>
<html>
<body id="body">
<script src="../resources/js-test-pre.js"></script>
<div id="content">

<div id="test" data="some data">
  <div id="firstChild"></div>
  <div id="secondChild"></div>
  <div id="thirdChild"></div>
</div>

<p id="description"></p>
<div id="console"></div>

<script>

    description("This tests ARIA IDL Attribute Reflection.");

    var element = document.getElementById("test");
    var data = element.getAttribute("data");
    var otherData = "other data";
    var currentProperty;
    var currentAttribute;

    function isElementReflectionProperty(property) {
        switch (property) {
            case "ariaActiveDescendantElement":
            case "ariaErrorMessageElement":
                return true;
        }
        return false;
    }

    function isElementsArrayReflectionProperty(property) {
        switch (property) {
            case "ariaControlsElements":
            case "ariaDescribedByElements":
            case "ariaDetailsElements":
            case "ariaFlowToElements":
            case "ariaLabelledByElements":
            case "ariaOwnsElements":
                return true;
        }
        return false;
    }

    function convertPropertyToAttribute(property) {
        if (isElementReflectionProperty(property))
          property = property.replace("Element", "");
        else if (isElementsArrayReflectionProperty(property))
          property = property.replace("Elements", "");
        return property.replace("aria", "aria-").toLowerCase();
    }

    function getDataProperty(property) {
        if (isElementReflectionProperty(property))
          return firstChild;
        else if (isElementsArrayReflectionProperty(property))
          return [firstChild, secondChild];
        return data;
    }

    function getDataAttribute(property) {
        if (isElementReflectionProperty(property))
          return firstChild.id;
        else if (isElementsArrayReflectionProperty(property))
          return firstChild.id + " " + secondChild.id;
        return data;
    }

    function getOtherDataProperty(property) {
        if (isElementReflectionProperty(property))
          return secondChild;
        else if (isElementsArrayReflectionProperty(property))
          return [thirdChild];
        return otherData;
    }

    function getOtherDataAttribute(property) {
        if (isElementReflectionProperty(property))
          return secondChild.id;
        else if (isElementsArrayReflectionProperty(property))
          return thirdChild.id;
        return otherData;
    }

    function testElement() {
        currentAttribute = convertPropertyToAttribute(currentProperty);

        debug("\nTest " + currentProperty + " < - > " + currentAttribute);
        shouldBeNull("element[currentProperty]");
        shouldBeNull("element.getAttribute(currentAttribute)");

        // Set the property value
        dataProperty = getDataProperty(currentProperty);
        dataAttribute = getDataAttribute(currentProperty);
        element[currentProperty] = dataProperty;
        shouldBe("element.getAttribute(currentAttribute)", "dataAttribute");

        // Set the attribute value
        otherDataProperty = getOtherDataProperty(currentProperty);
        otherDataAttribute = getOtherDataAttribute(currentProperty);
        debug("element.setAttribute(\"" + currentAttribute + "\", otherData);");
        element.setAttribute(currentAttribute, otherDataAttribute);
        shouldBe("element[currentProperty]", "otherDataProperty");
    }

    function testRole() {
        currentProperty = "role";
        testElement();
    }

    if (window.accessibilityController) {

        testRole();

        // There are 46 ARIA attributes in total.
        var count = 0;
        for (var propertyName in element) {
          if (propertyName.startsWith("aria")) {
              currentProperty = propertyName;
              testElement();
              count++;
          }
        }

        debug("\n");
        shouldBe("count", "46");

    } else {
        testFailed("Could not load accessibility controller");
    }

</script>

<script src="../resources/js-test-post.js"></script>
</body>
</html>
