blob: 5f35a9c96c77cd92e2ecfc6dc20729d9fb5a061e [file] [log] [blame]
// Test that exceptions are throw for invalid values for start and
// stop.
function testStartStop(should, node, options) {
// Test non-finite values for start. These should all throw a TypeError
const nonFiniteValues = [NaN, Infinity, -Infinity];
nonFiniteValues.forEach(time => {
should(() => {
node.start(time);
}, `start(${time})`)
.throw(TypeError);
});
should(() => {
node.stop();
}, 'Calling stop() before start()').throw(DOMException, 'InvalidStateError');
should(() => {
node.start(-1);
}, 'start(-1)').throw(RangeError);
if (options) {
options.forEach(test => {
should(() => {node.start(...test.args)},
'start(' + test.args + ')').throw(test.errorType);
});
}
node.start();
should(() => {
node.start();
}, 'Calling start() twice').throw(DOMException, 'InvalidStateError');
should(() => {
node.stop(-1);
}, 'stop(-1)').throw(RangeError);
// Test non-finite stop times
nonFiniteValues.forEach(time => {
should(() => {
node.stop(time);
}, `stop(${time})`)
.throw(TypeError);
});
}
/**
* @function
* @param {AudioScheduledSourceNode} node - The AudioScheduledSourceNode (e.g.,
* ConstantSourceNode, AudioBufferSourceNode) to test.
* @param {Array<Object>} [options] - Optional: An array of test objects for
* additional start() exceptions. Each object should have:
* - `errorType`: The expected error constructor(e.g., TypeError,
* RangeError).
* - `args`: An array of arguments to pass to the `node.start()` method.
* @description Tests that AudioScheduledSourceNode's `start()` and `stop()`
* methods throw the correct exceptions for invalid input values and states,
* according to the Web Audio API specification. This function uses
* `testharness.js` assertions.
*/
const testStartStop_W3CTH = (node, options) => {
// Test non-finite values for start. These should all throw a TypeError
const nonFiniteValues = [NaN, Infinity, -Infinity];
nonFiniteValues.forEach((time) => {
assert_throws_js(TypeError, () => {
node.start(time);
}, `start(${time})`);
});
assert_throws_dom('InvalidStateError', () => {
node.stop();
}, 'Calling stop() before start()');
assert_throws_js(RangeError, () => {
node.start(-1);
}, 'start(-1)');
if (options) {
options.forEach((test) => {
assert_throws_js(test.errorType, () => {
node.start(...test.args);
}, `start(${test.args})`);
});
}
node.start();
assert_throws_dom('InvalidStateError', () => {
node.start();
}, 'Calling start() twice');
assert_throws_js(RangeError, () => {
node.stop(-1);
}, 'stop(-1)');
// Test non-finite stop times
nonFiniteValues.forEach((time) => {
assert_throws_js(TypeError, () => {
node.stop(time);
}, `stop(${time})`);
});
}