blob: 4eb175f78a7ea569e4b4ed05f9d7bd60dd0589fa [file] [log] [blame]
// Test that constructor for the node with name |nodeName| handles the various
// possible values for channelCount, channelCountMode, and
// channelInterpretation.
function testAudioNodeOptions(context, nodeName, nodeOptions) {
if (nodeOptions === undefined)
nodeOptions = {};
var node;
var success = true;
// Test that we can set channelCount and that errors are thrown for invalid values
var testCount = 17;
if (nodeOptions.expectedChannelCount) {
testCount = nodeOptions.expectedChannelCount.value;
}
success = Should("new " + nodeName + "(c, {channelCount: " + testCount + "}}",
function () {
node = new window[nodeName](
context,
Object.assign({},
nodeOptions.additionalOptions, {
channelCount: testCount
}));
}).notThrow();
success = Should("node.channelCount", node.channelCount)
.beEqualTo(testCount) && success;
if (nodeOptions.expectedChannelCount && nodeOptions.expectedChannelCount.isFixed) {
// The channel count is fixed. Verify that we throw an error if we try to
// change it. Arbitrarily set the count to be one more than the expected
// value.
testCount = nodeOptions.expectedChannelCount.value + 1;
success = Should("new " + nodeName + "(c, {channelCount: " + testCount + "}}",
function () {
node = new window[nodeName](
context,
Object.assign({},
nodeOptions.additionalOptions, {
channelCount: testCount
}));
}).throw(nodeOptions.expectedChannelCount.errorType || "TypeError") && success;
} else {
// The channel count is not fixed. Try to set the count to invalid
// values and make sure an error is thrown.
var errorType = "NotSupportedError";
success = Should("new " + nodeName + "(c, {channelCount: 0}}",
function () {
node = new window[nodeName](
context,
Object.assign({},
nodeOptions.additionalOptions, {
channelCount: 0
}));
}).throw(errorType) && success;
success = Should("new " + nodeName + "(c, {channelCount: 99}}",
function () {
node = new window[nodeName](
context,
Object.assign({},
nodeOptions.additionalOptions, {
channelCount: 99
}));
}).throw(errorType) && success;
}
// Test channelCountMode
var testMode = "max";
if (nodeOptions && nodeOptions.expectedChannelCountMode) {
testMode = nodeOptions.expectedChannelCountMode.value;
}
success = Should("new " + nodeName + '(c, {channelCountMode: "' + testMode + '"}',
function () {
node = new window[nodeName](
context,
Object.assign({},
nodeOptions.additionalOptions, {
channelCountMode: testMode
}));
}).notThrow() && success;
success = Should("node.channelCountMode", node.channelCountMode)
.beEqualTo(testMode) && success;
if (nodeOptions.expectedChannelCountMode && nodeOptions.expectedChannelCountMode.isFixed) {
// Channel count mode is fixed. Test setting to something else throws.
var testModeMap = {
"max": "clamped-max",
"clamped-max": "explicit",
"explicit": "max"
};
testMode = testModeMap[nodeOptions.expectedChannelCountMode.value];
success = Should("new " + nodeName + '(c, {channelCountMode: "' + testMode + '"}',
function () {
node = new window[nodeName](
context,
Object.assign({},
nodeOptions.additionalOptions, {
channelCountMode: testMode
}));
}).throw(nodeOptions.expectedChannelCountMode.errorType) && success;
} else {
// Mode is not fixed. Verify that we can set the mode to all valid
// values, and that we throw for invalid values.
success = Should("new " + nodeName + '(c, {channelCountMode: "clamped-max"}',
function () {
node = new window[nodeName](
context,
Object.assign({},
nodeOptions.additionalOptions, {
channelCountMode: "clamped-max"
}));
}).notThrow() && success;
success = Should("node.channelCountMode", node.channelCountMode)
.beEqualTo("clamped-max") && success;
success = Should("new " + nodeName + '(c, {channelCountMode: "explicit"}',
function () {
node = new window[nodeName](
context,
Object.assign({},
nodeOptions.additionalOptions, {
channelCountMode: "explicit"
}));
}).notThrow() && success;
success = Should("node.channelCountMode", node.channelCountMode)
.beEqualTo("explicit") && success;
success = Should("new " + nodeName + '(c, {channelCountMode: "foobar"}',
function () {
node = new window[nodeName](
context,
Object.assign({},
nodeOptions.additionalOptions, {
channelCountMode: "foobar"
}));
}).throw("TypeError") && success;
success = Should("node.channelCountMode", node.channelCountMode)
.beEqualTo("explicit") && success;
}
// Test channelInterpretation
success = Should("new " + nodeName + '(c, {channelInterpretation: "speakers"})',
function () {
node = new window[nodeName](
context,
Object.assign({},
nodeOptions.additionalOptions, {
channelInterpretation: "speakers"
}));
}).notThrow() && success;
success = Should("node.channelInterpretation", node.channelInterpretation)
.beEqualTo("speakers") && success;
success = Should("new " + nodeName + '(c, {channelInterpretation: "discrete"})',
function () {
node = new window[nodeName](
context,
Object.assign({},
nodeOptions.additionalOptions, {
channelInterpretation: "discrete"
}));
}).notThrow() && success;
success = Should("node.channelInterpretation", node.channelInterpretation)
.beEqualTo("discrete") && success;
success = Should("new " + nodeName + '(c, {channelInterpretation: "foobar"})',
function () {
node = new window[nodeName](
context,
Object.assign({},
nodeOptions.additionalOptions, {
channelInterpretation: "foobar"
}));
}).throw("TypeError") && success;
success = Should("node.channelInterpretation", node.channelInterpretation)
.beEqualTo("discrete") && success;
Should("AudioNodeOptions for " + nodeName, success)
.summarize(
"were correctly handled",
"were not correctly handled");
}