<!DOCTYPE html>
<!--  Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang).  -->
<html>
    <head>
        <title>MediaSource.duration boundary condition test cases.</title>
        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
        <script src="mediasource-util.js"></script>
    </head>
    <body>
        <div id="log"></div>
        <script>
          function DurationBoundaryConditionTest(testDurationValue, expectedError, description)
          {
              return mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
              {
                  // Append initialization segment.
                  test.expectEvent(sourceBuffer, "updateend", "sourceBuffer");
                  test.expectEvent(mediaElement, "loadedmetadata", "mediaElement");
                  sourceBuffer.appendBuffer(MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init));
                  test.waitForExpectedEvents(function()
                  {
                      if (expectedError) {
                          assert_throws(expectedError,
                              function() { mediaSource.duration = testDurationValue; },
                              "mediaSource.duration assignment throws an exception for " + testDurationValue);
                          test.done();
                          return;
                      }

                      mediaSource.duration = testDurationValue;

                      assert_equals(mediaSource.duration, testDurationValue, "mediaSource.duration");
                      assert_equals(mediaElement.duration, testDurationValue, "mediaElement.duration");

                      test.expectEvent(mediaElement, "durationchange", "mediaElement");
                      test.waitForExpectedEvents(function()
                      {
                          assert_equals(mediaSource.duration, testDurationValue, "mediaSource.duration");
                          assert_equals(mediaElement.duration, testDurationValue, "mediaElement.duration");
                          test.done();
                      });
                  });

              }, description);
          }

          DurationBoundaryConditionTest(Math.pow(2, 31) - 1, null, "Set duration to 2^31 - 1");
          DurationBoundaryConditionTest(1, null, "Set duration to 1");
          DurationBoundaryConditionTest(Number.MAX_VALUE, null, "Set duration to Number.MAX_VALUE");
          DurationBoundaryConditionTest(Number.MIN_VALUE, null, "Set duration to Number.MIN_VALUE");
          DurationBoundaryConditionTest(Number.MAX_VALUE - 1, null, "Set duration to Number.MAX_VALUE - 1");
          DurationBoundaryConditionTest(Number.MIN_VALUE - 1, new TypeError(), "Set duration to Number.MIN_VALUE - 1");
          DurationBoundaryConditionTest(Number.POSITIVE_INFINITY, null, "Set duration to Number.POSITIVE_INFINITY");
          DurationBoundaryConditionTest(Number.NEGATIVE_INFINITY, new TypeError(), "Set duration to Number.NEGATIVE_INFINITY");
          DurationBoundaryConditionTest(-1 * Number.MAX_VALUE, new TypeError(), "Set duration to lowest value.");
          DurationBoundaryConditionTest(-101.9, new TypeError(), "Set duration to a negative double.");
          DurationBoundaryConditionTest(101.9, null, "Set duration to a positive double.");
          DurationBoundaryConditionTest(0, null, "Set duration to zero");
          DurationBoundaryConditionTest(NaN, new TypeError(), "Set duration to NaN");
        </script>
    </body>
</html>
