<!DOCTYPE html>

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

<body>

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

<script>
description("This tests that we don't trigger an assertion failure due to AudioNode connection order.");

var sampleRate = 44100.0;
var renderLengthSeconds = 0.125;
var delayTimeSeconds = 0.1;

function createSinWaveBuffer(context, lengthInSeconds, frequency) {
    var audioBuffer = context.createBuffer(1, lengthInSeconds * sampleRate, sampleRate);

    var n = audioBuffer.length;
    var data = audioBuffer.getChannelData(0);

    for (var i = 0; i < n; ++i) {
        data[i] = Math.sin(frequency * 2 * Math.PI * i / sampleRate);
    }

    return audioBuffer;
}

function runTest() {
    window.jsTestIsAsync = true;
        
    // Create offline audio context.
    var context = new OfflineAudioContext(1, sampleRate * renderLengthSeconds, sampleRate);
    var toneBuffer = createSinWaveBuffer(context, renderLengthSeconds, 880);
    
    var bufferSource = context.createBufferSource();
    bufferSource.buffer = toneBuffer;
    bufferSource.connect(context.destination);

    var delay = context.createDelay();
    delay.delayTime.value = delayTimeSeconds;

    // We connect delay node to gain node before anything is connected to delay node itself.
    // We do this because we try to trigger the ASSERT which might be fired due to AudioNode connection order,
    // especially when gain node and delay node is involved e.g. https://bugs.webkit.org/show_bug.cgi?id=76685.

    var gain = context.createGain();
    gain.connect(context.destination);
    delay.connect(gain);

    bufferSource.start(0);

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

runTest();

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