<!DOCTYPE html>
<html>
<body>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script>

var changeTest = async_test("Test that orientationchange event is fired when the orientation changes.");
var noChangeTest = async_test("Test that orientationchange event is not fired when the orientation does not change.");

var orientations = [
  'portrait-primary',
  'portrait-secondary',
  'landscape-primary',
  'landscape-secondary'
];

var currentIndex = orientations.indexOf(window.screen.orientation.type);
// Count the number of calls received from the EventHandler set on screen.orientation.onchange.
var orientationChangeEventHandlerCalls = 0;
// Count the number of calls received from the listener set with screen.orientation.addEventListene().
var orientationChangeEventListenerCalls = 0;

var orientationChangeContinuation = null;

function getNextIndex() {
  return (currentIndex + 1) % orientations.length;
}

window.screen.orientation.onchange = function() {
  orientationChangeEventHandlerCalls++;
  if (orientationChangeEventContinuation) {
    setTimeout(orientationChangeEventContinuation);
    orientationChangeEventContinuation = null;
  }
};

window.screen.orientation.addEventListener('change', function() {
  orientationChangeEventListenerCalls++;
});

function runNoChangeTest() {
  window.testRunner.setMockScreenOrientation(orientations[currentIndex]);

  noChangeTest.step(function() {
    assert_equals(screen.orientation.type, orientations[currentIndex]);
    assert_equals(orientationChangeEventHandlerCalls, 4);
    assert_equals(orientationChangeEventListenerCalls, 4);
  });

  noChangeTest.done();
}

var i = 0;
function runChangeTest() {
  window.testRunner.setMockScreenOrientation(orientations[getNextIndex()]);
  currentIndex = getNextIndex();

  orientationChangeEventContinuation = function() {
    changeTest.step(function() {
      assert_equals(screen.orientation.type, orientations[currentIndex]);
      assert_equals(orientationChangeEventHandlerCalls, i + 1);
      assert_equals(orientationChangeEventListenerCalls, i + 1);
    });

    ++i;
    if (i == 4) {
      changeTest.done();
      runNoChangeTest();
    } else {
      runChangeTest();
    }
  };
}

runChangeTest();

</script>
</body>
</html>
