<!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("This test verifies that the AudioBasicInspectorNode based nodes work correctly.");

var sampleRate = 44100.0;
// We carefully arrange the renderLengthInFrames to be a multiple of the AudioNode rendering quantum (AudioNode::ProcessingSizeInFrames)
// so that AudioSourceNode will not feed tailing zeroes into the context and fail this test.
var renderLengthInFrames = 256;
var fftSize = 64;

var audioDataOne = 255; // Audio data 1.0 in Uint8 format will be 255.
var audioDataZero = 128; // Audio data 0 in Uint8 format will be 128.

var context;
var constantBuffer;
var bufferSource;
var analyser;

function constructCommonGraph() {
    // Create offline audio context.
    context = new webkitOfflineAudioContext(1, renderLengthInFrames, sampleRate);
    constantBuffer = createConstantBuffer(context, renderLengthInFrames, 1);

    bufferSource = context.createBufferSource();
    bufferSource.buffer = constantBuffer;

    analyser = context.createAnalyser();
    analyser.fftSize = fftSize;

    bufferSource.connect(analyser);
}

function test1Finished() {
    var timeDomainData = new Uint8Array(fftSize);
    analyser.getByteTimeDomainData(timeDomainData);

    if (timeDomainData[0] >= audioDataOne)
        testPassed("RealtimeAnalyserNode got pulled when connected from upstream node but not to downstream node.");
    else
        testFailed("RealtimeAnalyserNode failed to get pulled when connected from upstream node but not to downstream node.");

    test2();
}

// To verify the realtimeAnalyser can pull data when there is an upstream node connected to it
// but it's not connected to a downstream node.
function test1() {
    constructCommonGraph();

    bufferSource.noteOn(0);

    context.oncomplete = test1Finished;
    context.startRendering();
}

function test2Finished() {
    var timeDomainData = new Uint8Array(fftSize);
    analyser.getByteTimeDomainData(timeDomainData);

    if (timeDomainData[0] >= audioDataOne)
        testPassed("RealtimeAnalyserNode got pulled when connected from upstream node and to destination node.");
    else
        testFailed("RealtimeAnalyserNode failed to be pulled when connected by upstream node and to destination node.");

    test3();
}

// To verify the realtimeAnalyser can process normally when there is an upstream node connected to it
// and it's also connected to a downstream node which ultimately connect to audio destination.
function test2() {
    constructCommonGraph();

    analyser.connect(context.destination);

    bufferSource.noteOn(0);

    context.oncomplete = test2Finished;
    context.startRendering();
}

function test3Finished() {
    var timeDomainData = new Uint8Array(fftSize);
    analyser.getByteTimeDomainData(timeDomainData);

    // If realtimeAnalyser hasn't pulled any data, the data in buffer will be 0.
    if (timeDomainData[0] == audioDataZero)
        testPassed("RealtimeAnalyserNode didn't get pulled when it should not.");
    else
        testFailed("RealtimeAnalyserNode been pulled when it should not.");

    finishJSTest();
}

// To verify the realtimeAnalyser will stop pulling if it is connected to a downstream node
// which is not ultimatly connected to any audio destination.
function test3() {
    constructCommonGraph();

    var gain = context.createGainNode();
    analyser.connect(gain);

    bufferSource.noteOn(0);

    context.oncomplete = test3Finished;
    context.startRendering();
}

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

    window.jsTestIsAsync = true;

    test1();
}

runTest();

</script>

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