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

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

<script>
description("Basic tests for BiquadFilterNode.");

var context = 0;

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

    context = new AudioContext();
    var filter = context.createBiquadFilter();
   
    if (filter.numberOfInputs === 1) 
        testPassed("BiquadFilterNode has one input.");
    else
        testFailed("BiquadFilterNode should have one input.");
    
    if (filter.numberOfOutputs === 1) 
        testPassed("BiquadFilterNode has one output.");
    else
        testFailed("BiquadFilterNode should have one output.");
    
    if (filter.type === "lowpass")
        testPassed("Biquad filter defaults to low-pass filter.");
    else
        testFailed("Biquad filter should default to low-pass filter.");
    
    if (filter.frequency.value === 350)
        testPassed("The default value of frequency is 350.");
    else
        testFailed("The default value of frequency should be 350.");
    
    if (filter.Q.value === 1)
        testPassed("The default value of Q is 1.");
    else
        testFailed("The default value of Q should be 1.");
    
    if (filter.gain.value === 0)
        testPassed("The default value of gain is 0.");
    else
        testFailed("The default value of gain should be 0.");

    // Check that all legal filter types can be set.
    var filterTypeArray = [{type: "lowpass"},
                           {type: "highpass"},
                           {type: "bandpass"},
                           {type: "lowshelf"},
                           {type: "highshelf"},
                           {type: "peaking"},
                           {type: "notch"},
                           {type: "allpass"}];

    for (var i = 0; i < filterTypeArray.length; ++i) {
        try {
            filter.type = filterTypeArray[i].type;
            if (filter.type === filterTypeArray[i].type) {
                var message = "Biquad filter type '" + filterTypeArray[i].type + "' is settable.";
                testPassed(message);
            } else {
                var message = "Biquad filter type '" + filterTypeArray[i].type + "' was not correctly set.";
                testFailed(message);
            }
        } catch(e) {
            var message = "Biquad filter type " + i + " should not throw exception.";
            testFailed(message);
        }
    }


    // Check that numerical values are no longer supported
    filter.type = 99;
    if (filter.type == 99)
        testFailed("Biquad filter type incorrectly set to 99.")
    else
        testPassed("Biquad filter type correctly not set to 99.");

    finishJSTest();
}

runTest();

</script>

</body>
</html>
