<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<!--
Create an oscillator of each type and verify that the type is set correctly.
-->
<html>
<head>
<script type="text/javascript" src="resources/audio-testing.js"></script>
<script type="text/javascript" src="../resources/js-test.js"></script>
</head>

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

<script>
description("Basic test of setting Oscillator node types.");

var sampleRate = 44100;
var renderLengthSeconds = 0.25;

var oscTypes = [{type: "sine", name: "SINE"},
                {type: "square", name: "SQUARE"},
                {type: "sawtooth", name: "SAWTOOTH"},
                {type: "triangle", name: "TRIANGLE"},
                {type: "custom", name: "CUSTOM"}];

function runTest() 
{
    window.jsTestIsAsync = true;
        
    // Create offline audio context.
    var context = new webkitOfflineAudioContext(2, sampleRate * renderLengthSeconds, sampleRate);
    var osc = context.createOscillator();

    // Set each possible oscillator type (except custom) and verify that the type is correct.
    // Here we're setting the type using WebIDL enum values which are strings.
    for (var k = 0; k < oscTypes.length - 1; ++k) {
        osc.type = oscTypes[k].type;
        if (osc.type == oscTypes[k].type)
            testPassed("Oscillator correctly set to " + oscTypes[k].name + " type.");
        else
            testFailed("Oscillator set to " + oscTypes[k].name + " type, but returns " + oscTypes[osc.type].name + " type.");
    }

    // Now set a custom oscillator
    var coeffA = new Float32Array([0, 1, 0.5]);
    var coeffB = new Float32Array([0, 0, 0]);        
    var wave = context.createPeriodicWave(coeffA, coeffB);
    osc.setPeriodicWave(wave);
    if (osc.type == "custom")
        testPassed("Oscillator correctly set to CUSTOM type using setPeriodicWave.");
    else
        testFailed("Oscillator set to CUSTOM type, but returns " + oscTypes[osc.type].name + " type.");

    // Try setting some invalid types
    try {
        osc.type = "sine";
        osc.type = "custom";
        testFailed("Directly setting oscillator type to custom did not throw exception.");
    } catch (e) {
        testPassed("Directly setting oscillator type to custom correctly throws exception.");
    }

    // Check that we don't throw an exception for illegal .type values as per WebIDL.
    shouldNotThrowException(function() { osc.type = "xyz12349jfksd"; }, "Setting .type to illegal string value");
    shouldNotThrowException(function() { osc.type = new Float32Array(1); }, "Setting .type to illegal type");

    finishJSTest();
}

runTest();
successfullyParsed = true;

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