// This depends on audit.js to define the |should| function used herein.
//
// Test that setPosition throws an error if there is already a
// setValueCurve scheduled during the same time period.
function testPositionSetterVsCurve(should, context, options) {
// Create the graph consisting of a source node and the panner.
let src = new ConstantSourceNode(context, {offset: 1});
let panner = new PannerNode(context);
src.connect(panner).connect(context.destination);
let curve = Float32Array.from([-10, 10]);
// Determine if we're testing the panner or the listener and set the node
// appropriately.
let testNode = options.nodeName === 'panner' ? panner : context.listener;
let prefix = options.nodeName === 'panner' ? 'panner.' : 'listener.';
let message = prefix + options.paramName + '.setValueCurve(..., 0, ' +
options.curveDuration + ')';
// If the coordinate name has 'position', we're testing setPosition;
// otherwise assume we're testing setOrientation.
let methodName =
options.paramName.includes('position') ? 'setPosition' : 'setOrientation';
// Sanity check that we're testing the right node. (The |testName| prefix is
// to make each message unique for testharness.)
if (options.nodeName === 'panner') {
should(
testNode instanceof PannerNode,
options.testName + ': Node under test is a PannerNode')
.beTrue();
} else {
should(
testNode instanceof AudioListener,
options.testName + ': Node under test is an AudioLIstener')
.beTrue();
}
// Set the curve automation on the specified axis.
should(() => {
testNode[options.paramName].setValueCurveAtTime(
curve, 0, options.curveDuration);
}, message).notThrow();
let resumeContext = context.resume.bind(context);
// Get correct argument string for the setter for printing the message.
let setterArguments;
if (options.nodeName === 'panner') {
setterArguments = '(1,1,1)';
} else {
if (methodName === 'setPosition') {
setterArguments = '(1,1,1)';
} else {
setterArguments = '(1,1,1,1,1,1)';
}
}
let setterMethod = () => {
// It's ok to give extra args.
testNode[methodName](1, 1, 1, 1, 1, 1);
};
if (options.suspendFrame) {
// We're testing setPosition after the curve has ended to verify that
// we don't throw an error. Thus, suspend the context and call
// setPosition.
let suspendTime = options.suspendFrame / context.sampleRate;
context.suspend(suspendTime)
.then(() => {
should(
setterMethod,
prefix + methodName + setterArguments + ' for ' +
options.paramName + ' at time ' + suspendTime)
.notThrow();
})
.then(resumeContext);
} else {
// Basic test where setPosition is called where setValueCurve is
// already active.
context.suspend(0)
.then(() => {
should(
setterMethod,
prefix + methodName + setterArguments + ' for ' +
options.paramName)
.throw(DOMException, 'NotSupportedError');
})
.then(resumeContext);
}
src.start();
return context.startRendering();
}