<!DOCTYPE html>
<html>
<head>
<script src="../resources/js-test-pre.js"></script>
<script type="text/javascript" src="resources/audio-testing.js"></script>
</head>
<body>
<script>
description("Basic tests for decodeAudioData function.");

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

var context = new webkitAudioContext();

// decodeAudioData should raise exception when arraybuffer parameter is null.
shouldThrow("context.decodeAudioData(null, function(){}, function(){});", "'TypeError: Argument 1 (\\'audioData\\') to webkitAudioContext.decodeAudioData must be an instance of ArrayBuffer'");

var decodeCaseArray = [{url: "resources/media/24bit-44khz.wav", result: true},
                       {url: "resources/media/invalid-audio-file.txt", result: false}];

function runDecodeTest(index) {
    if (index >= decodeCaseArray.length) {
        finishJSTest();
        return;
    }

    var request = new XMLHttpRequest();
    request.open("GET", decodeCaseArray[index].url, true);
    request.responseType = "arraybuffer";
    
    request.onload = function() {
        context.decodeAudioData(request.response, successCallback, errorCallback);
        
        function successCallback() {
            if (decodeCaseArray[index].result)
                testPassed("The " + decodeCaseArray[index].url +  " test: successCallback has been called correctly.");
            else
                testFailed("The " + decodeCaseArray[index].url + " test: successCallback was not called.");
            
            runDecodeTest(++index);
        }
        
        function errorCallback() {
            if (decodeCaseArray[index].result)
                testFailed("The " + decodeCaseArray[index].url + " test: errorCallback was called incorrectly.");
            else
                testPassed("The " + decodeCaseArray[index].url + " test: errorCallback has been called correctly.");

            runDecodeTest(++index);
        }
    }
    request.send();
}

runDecodeTest(0);

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