<!DOCTYPE html>

<html>
<head>
<script src="../resources/js-test-pre.js"></script>
<script type="text/javascript" src="resources/audio-testing.js"></script>
</head>

<body>
<div id="description"></div>
<div id="console"></div>

<script>
description("Basic tests for AudioNode API.");

var context = 0;
var context2 = 0;

function runTest() {
    if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
    }
    
    window.jsTestIsAsync = true;

    context = new webkitAudioContext();
    window.audioNode = context.createBufferSource();

    shouldThrow("audioNode.noteOn()");
    shouldThrow("audioNode.noteGrainOn()");
    shouldThrow("audioNode.noteOff()");

    // Check input and output numbers of AudioSourceNode.
    if (audioNode.numberOfInputs === 0)
        testPassed("Source AudioNode has no inputs.");
    else
        testFailed("Source AudioNode should not have inputs.");
    
    if (audioNode.numberOfOutputs === 1)
        testPassed("Source AudioNode has one output.");
    else
        testFailed("Source AudioNode should have one output.");

    // Check input and output numbers of AudioDestinationNode
    if (context.destination.numberOfInputs === 1)
        testPassed("Destination AudioNode has one input.");
    else
        testFailed("Destination AudioNode should have one input.");

    if (context.destination.numberOfOutputs === 0)
        testPassed("Destination AudioNode has no outputs.");
    else
        testFailed("Destination AudioNode should have no outputs.");

    // Try calling connect() method with illegal values.

    try {
        audioNode.connect(0, 0, 0);
        testFailed("connect() exception should be thrown for illegal destination AudioNode.");
    } catch(e) {
        testPassed("connect() exception thrown for illegal destination AudioNode.");
    }

    try {
        audioNode.connect(context.destination, 5, 0);
        testFailed("connect() exception should be thrown for illegal output index.");
    } catch(e) {
        testPassed("connect() exception thrown for illegal output index.");
    }

    try {
        audioNode.connect(context.destination, 0, 5);
        testFailed("connect() exception should be thrown for illegal input index.");
    } catch(e) {
        testPassed("connect() exception thrown for illegal input index.");
    }

    // Try calling connect() with proper values.
    try {
        audioNode.connect(context.destination, 0, 0);
        testPassed("audioNode.connect(context.destination) succeeded.");
    } catch(e) {
        testFailed("audioNode.connect(context.destination) failed.");
    }
    
    // Create a new context and try to connect the other context's node to this one.
    try {
        context2 = new webkitAudioContext();
        window.audioNode.connect(context2.destination);
        testFailed("exception should be thrown when connecting to other context's node.");
    } catch(e) {
        testPassed("exception thrown when connecting to other context's node.");
    }

    // Create a new context with not enough arguments
    try {
        context2 = new webkitAudioContext(0, 0);
        testFailed("exception should be thrown when creating audio context with not enough arguments.");
    } catch(e) {
        testPassed("exception thrown when creating audio context with not enough arguments.");
    }

    // Ensure it is an EventTarget
    try {
        audioNode.addEventListener('testEvent', function(){
            testPassed("AudioNode is an EventTarget");
        });
        audioNode.dispatchEvent(new Event('testEvent'));
    } catch(e) {
        testFailed("exception shouldn't be thrown when testing whether audio node is an event target");
    }

    finishJSTest();
}

runTest();

</script>

<script src="../resources/js-test-post.js"></script>
</body>
</html>
