<!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();

try {
    context.decodeAudioData(null, function(){}, function(){});
    testFailed("decodeAudioData should raise exception when arraybuffer parameter is null.");
} catch(e) {
    testPassed("decodeAudioData raises exception correctly when arraybuffer parameter is null.");
}

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>
