<!DOCTYPE html>
<html>
  <head>
    <title>
      Test AudioScheduledSourceNode
    </title>
    <script src="../imported/w3c/web-platform-tests/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>
