1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
// 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})`);
});
}
|