<!DOCTYPE html>
<html>
<head>
   <meta charset="UTF-8">
   <title></title>

  <style>
  .outerBlock {
     border: 1px solid black;
     -webkit-transition: all 1s linear;
     -moz-transition: all 1s linear;
  }

  .innerBlock {
     background-color: green;
     height: 100px;
     -webkit-transition: all 1s linear;
     -moz-transition: all 1s linear;
  }

  #outer {
     width: 100px;
  }

  #outer.go {
     width: 500px;
  }

  #inner {
     width: calc(50% + 10px);
  }

  #innerTransition {
     width: calc(10% + 10px);
  }

  #innerTransition.go {
     width: calc(100% - 10px);
  }
  </style>
</head>

<body>
  This tests that calc() expressions depending on transitioning elements behave correctly.
  <div class="outerBlock" id="outer">
     <div class="innerBlock" id="inner"></div>
     <div class="innerBlock" id="innerTransition"></div>
  </div>
  <div id="result"></div>
</body>

<script src="../../transitions/resources/transition-test-helpers.js"></script>
<script>

if (window.testRunner)
    testRunner.dumpAsText();

const transitioningElements = ["outer", "innerTransition"];

expectedValues = [
    // time, element, property, expected-value, depends-on
    [0.00, "inner", 'width', 60, "outer"],
    [0.25, "inner", 'width', 110, "outer"],
    [0.50, "inner", 'width', 160, "outer"],
    [0.75, "inner", 'width', 210, "outer"],
    [1.00, "inner", 'width', 260, "outer"],

    [0.00, "innerTransition", 'width', 60, "outer"],
    [0.25, "innerTransition", 'width', 167.5, "outer"],
    [0.50, "innerTransition", 'width', 275, "outer"],
    [0.75, "innerTransition", 'width', 382.5, "outer"],
    [1.00, "innerTransition", 'width', 490, "outer"],
];

function getPropertyCSSValue(elementId, property)
{
    let element = document.getElementById(elementId);
    let style = window.getComputedStyle(element, null);
    return style.getPropertyValue(property);
}

function runTest(expected)
{
    let result = document.getElementById("result");
    for (let i = 0; i < expected.length; i++) {
        let [time, elementId, property, expectedValue, dependsOn] = expected[i];
        let elem = (i < 5) ? dependsOn : elementId;
        pauseTransitionAtTimeOnElement(property, time, document.getElementById(elem));
        let actual = Number.parseFloat(getPropertyCSSValue(elementId, property));
        if (actual == expectedValue)
            result.innerHTML += 'PASS - "' + property + '" property for "' + elementId +'" element at ' + time + 's was: ' + actual + '<br/>';
        else
            result.innerHTML += 'FAIL - "' + property + '" property for "' + elementId +'" element at ' + time + 's expected: ' + expectedValue + ' but saw: ' + actual + '<br/>';
    }
    if (window.testRunner)
        testRunner.notifyDone();
}

function loadListener()
{
    waitForAnimationStart(function(){runTest(expectedValues);});
}

for (let each of transitioningElements) {
    let element = document.getElementById(each);
    element.className += " go";
}

window.addEventListener("load", loadListener, false);
if (window.testRunner)
    testRunner.waitUntilDone();

</script>

</html>
