<!DOCTYPE html>
<html>
  <head>
    <title>
      Test Onended Event Listener
    </title>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
    <script src="/webaudio/resources/audit-util.js"></script>
    <script src="/webaudio/resources/audit.js"></script>
  </head>
  <body>
    <script id="layout-test-code">
      let sampleRate = 44100;
      let renderLengthSeconds = 1;
      let renderLengthFrames = renderLengthSeconds * sampleRate;

      // Length of the source buffer.  Anything less than the render length is
      // fine.
      let sourceBufferLengthFrames = renderLengthFrames / 8;
      // When to stop the oscillator.  Anything less than the render time is
      // fine.
      let stopTime = renderLengthSeconds / 8;

      let audit = Audit.createTaskRunner();

      audit.define('absn-set-onended', (task, should) => {
        // Test that the onended event for an AudioBufferSourceNode is fired
        // when it is set directly.
        let context =
            new OfflineAudioContext(1, renderLengthFrames, sampleRate);
        let buffer = context.createBuffer(
            1, sourceBufferLengthFrames, context.sampleRate);
        let source = context.createBufferSource();
        source.buffer = buffer;
        source.connect(context.destination);
        source.onended = function(e) {
          should(
              true, 'AudioBufferSource.onended called when ended set directly')
              .beEqualTo(true);
        };
        source.start();
        context.startRendering().then(() => task.done());
      });

      audit.define('absn-add-listener', (task, should) => {
        // Test that the onended event for an AudioBufferSourceNode is fired
        // when addEventListener is used to set the handler.
        let context =
            new OfflineAudioContext(1, renderLengthFrames, sampleRate);
        let buffer = context.createBuffer(
            1, sourceBufferLengthFrames, context.sampleRate);
        let source = context.createBufferSource();
        source.buffer = buffer;
        source.connect(context.destination);
        source.addEventListener('ended', function(e) {
          should(
              true,
              'AudioBufferSource.onended called when using addEventListener')
              .beEqualTo(true);
        });
        source.start();
        context.startRendering().then(() => task.done());
      });

      audit.define('osc-set-onended', (task, should) => {
        // Test that the onended event for an OscillatorNode is fired when it is
        // set directly.
        let context =
            new OfflineAudioContext(1, renderLengthFrames, sampleRate);
        let source = context.createOscillator();
        source.connect(context.destination);
        source.onended = function(e) {
          should(true, 'Oscillator.onended called when ended set directly')
              .beEqualTo(true);
        };
        source.start();
        source.stop(stopTime);
        context.startRendering().then(() => task.done());
      });

      audit.define('osc-add-listener', (task, should) => {
        // Test that the onended event for an OscillatorNode is fired when
        // addEventListener is used to set the handler.
        let context =
            new OfflineAudioContext(1, renderLengthFrames, sampleRate);
        let source = context.createOscillator();
        source.connect(context.destination);
        source.addEventListener('ended', function(e) {
          should(true, 'Oscillator.onended called when using addEventListener')
              .beEqualTo(true);
        });
        source.start();
        source.stop(stopTime);
        context.startRendering().then(() => task.done());
      });

      audit.run();
    </script>
  </body>
</html>
