<!DOCTYPE html>
<html>
  <head>
    <title>
      Test AudioScheduledSourceNode
    </title>
    <script src="../resources/testharness.js"></script>
    <script src="../resources/testharnessreport.js"></script>
    <script src="resources/audit.js"></script>
  </head>
  <body>
    <script id="layout-test-code">
      let context = new AudioContext();

      let audit = Audit.createTaskRunner();

      audit.define(
          {
            label: 'construction',
            description: 'Construct AudioScheduledSourceNode'
          },
          function(task, should) {
            should(function() {
              return new AudioScheduledSourceNode(context);
            }, 'new AudioScheduledSourceNode(c)').throw('TypeError');

            task.done();
          });

      audit.define(
          {
            label: 'properties',
            description: 'Test properties on derived nodes'
          },
          function(task, should) {
            let expectedProperties = ['start', 'stop', 'onended'];

            // AudioScheduledSourceNode must have these properties.
            for (p in expectedProperties) {
              should(
                  AudioScheduledSourceNode.prototype,
                  'AudioScheduledSourceNode.prototype')
                  .haveOwnProperty(expectedProperties[p]);
            }

            // ConstantSource and Oscillator must not
            let nodes = ['ConstantSourceNode', 'OscillatorNode'];
            for (n in nodes) {
              for (p in expectedProperties) {
                should(window[nodes[n]].prototype, nodes[n] + '.prototype')
                    .notHaveOwnProperty(expectedProperties[p]);
              }
            }

            // AudioBufferSourceNode has it's own start method, but should not
            // have the others.
            for (p in expectedProperties) {
              if (expectedProperties[p] !== 'start') {
                should(
                    AudioBufferSourceNode.prototype,
                    'AudioBufferSourceNode.prototype')
                    .notHaveOwnProperty(expectedProperties[p]);
              }
            }

            should(
                AudioBufferSourceNode.prototype,
                'AudioBufferSourceNode.prototype')
                .haveOwnProperty('start');

            task.done();
          });

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