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

<body>

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

<script>
description("Tests ScriptProcessorNode.");

var sampleRate = 44100.0;
var outputChannels = 6;

// For the current implementation of ScriptProcessorNode, when it works with OfflineAudioContext (which runs much faster
// than real-time) the event.inputBuffer might be overwrite again before onaudioprocess ever get chance to be called.
// We carefully arrange the renderLengthInFrames and bufferSize to have exactly the same value to avoid this issue.
var renderLengthInFrames = 512;
var bufferSize = 512;

var context;

function createBuffer(context, length) {
    var audioBuffer = context.createBuffer(2, length, sampleRate);
    var n = audioBuffer.length;
    var dataL = audioBuffer.getChannelData(0);
    var dataR = audioBuffer.getChannelData(1);

    for (var i = 0; i < n; ++i) {
        dataL[i] = -1;
        dataR[i] = 1;
    }

    return audioBuffer;
}

function processAudioData(event) {
    buffer = event.outputBuffer;
    if (buffer.numberOfChannels != outputChannels)
        testFailed("numberOfOutputChannels doesn't match!");

    if (buffer.length != bufferSize)
        testFailed("numberOfOutputChannels doesn't match!");

    buffer = event.inputBuffer;
    var bufferDataL = buffer.getChannelData(0);
    var bufferDataR = buffer.getChannelData(1);
    
    var success = true;
    // Go through every sample and make sure it's all -1 for the left-channel, and all +1 for the right-channel.
    for (var i = 0; i < buffer.length; ++i) {
        if (bufferDataL[i] != -1 || bufferDataR[i] != 1) {
            success = false;
            break;
        }
    }

    if (success) {
        testPassed("onaudioprocess was called with correct data.");
    } else {
        testFailed("onaudioprocess was called with wrong data.");
    }
}

function doBufferSizeTest(size) {
    try {
        var jsnode = context.createScriptProcessor(size, 1, 1);
        testPassed("Successfully created ScriptProcessorNode with bufferSize = " + size + ".");
    } catch(e) {
        testFailed("Failed to create ScriptProcessorNode with bufferSize = " + size + ".");
    }
}

function runTest() {
    window.jsTestIsAsync = true;

    // Create offline audio context.
    context = new webkitOfflineAudioContext(2, renderLengthInFrames, sampleRate);

    try {
        var jsnode = context.createScriptProcessor(512, 0, 0);
        testFailed("Exception should be thrown when both numberOfInputChannels and numberOfOutputChannels are zero.");
    } catch(e) {
        testPassed("Exception was thrown when both numberOfInputChannels and numberOfOutputChannels are zero.");
    }
    
    try {
        var jsnode = context.createScriptProcessor(512, 1, 0);
        testPassed("Successfully created ScriptProcessorNode with numberOfInputChannels = 1 and numberOfOutputChannels = 0.");
    } catch(e) {
        testFailed("Exception should not be thrown when numberOfInputChannels = 1 and numberOfOutputChannels = 0.");
    }
    
    try {
        var jsnode = context.createScriptProcessor(512, 2, 0);
        testPassed("Successfully created ScriptProcessorNode with numberOfInputChannels = 2 and numberOfOutputChannels = 0.");
    } catch(e) {
        testFailed("Exception should not be thrown when numberOfInputChannels = 2 and numberOfOutputChannels = 0.");
    }
    
    try {
        var jsnode = context.createScriptProcessor(512, 0, 1);
        testPassed("Successfully created ScriptProcessorNode with numberOfInputChannels = 0 and numberOfOutputChannels = 1.");
    } catch(e) {
        testFailed("Exception should not be thrown when numberOfInputChannels = 0 and numberOfOutputChannels = 1.");
    }
    
    try {
        var jsnode = context.createScriptProcessor(512, 0, 2);
        testPassed("Successfully created ScriptProcessorNode with numberOfInputChannels = 0 and numberOfOutputChannels = 2.");
    } catch(e) {
        testFailed("Exception should not be thrown when numberOfInputChannels = 0 and numberOfOutputChannels = 2.");
    }
    
    try {
        var jsnode = context.createScriptProcessor(511, 1, 1);
        testFailed("Exception should be thrown for illegal bufferSize.");
    } catch(e) {
        testPassed("Exception was thrown for illegal bufferSize.");
    }

    doBufferSizeTest(0);
    doBufferSizeTest(256);
    doBufferSizeTest(512);
    doBufferSizeTest(1024);
    doBufferSizeTest(2048);
    doBufferSizeTest(4096);
    doBufferSizeTest(8192);
    doBufferSizeTest(16384);
 
    var sourceBuffer = createBuffer(context, renderLengthInFrames);

    var bufferSource = context.createBufferSource();
    bufferSource.buffer = sourceBuffer;

    var jsnode = context.createScriptProcessor(bufferSize, 2, outputChannels);

    bufferSource.connect(jsnode);
    jsnode.connect(context.destination);
    jsnode.onaudioprocess = processAudioData;

    bufferSource.start(0);
    context.oncomplete = finishJSTest;
    context.startRendering();
}

runTest();

</script>
</body>
</html>
