blob: 7828f05226151ebf7d6c7ec984cae1f90ef848d2 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<title>
Test Basic IIRFilterNode Properties
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../resources/audit-util.js"></script>
<script src="../../resources/audit.js"></script>
</head>
<body>
<script id="layout-test-code">
let sampleRate = 48000;
let testFrames = 100;
// Global context that can be used by the individual tasks. It must be
// defined by the initialize task.
let context;
let audit = Audit.createTaskRunner();
audit.define('initialize', (task, should) => {
should(() => {
context = new OfflineAudioContext(1, testFrames, sampleRate);
}, 'Initialize context for testing').notThrow();
task.done();
});
audit.define('existence', (task, should) => {
should(context.createIIRFilter, 'context.createIIRFilter').exist();
task.done();
});
audit.define('parameters', (task, should) => {
// Create a really simple IIR filter. Doesn't much matter what.
let coef = Float32Array.from([1]);
let f = context.createIIRFilter(coef, coef);
should(f.numberOfInputs, 'numberOfInputs').beEqualTo(1);
should(f.numberOfOutputs, 'numberOfOutputs').beEqualTo(1);
should(f.channelCountMode, 'channelCountMode').beEqualTo('max');
should(f.channelInterpretation, 'channelInterpretation')
.beEqualTo('speakers');
task.done();
});
audit.define('exceptions-createIIRFilter', (task, should) => {
should(function() {
// Two args are required.
context.createIIRFilter();
}, 'createIIRFilter()').throw(TypeError);
should(function() {
// Two args are required.
context.createIIRFilter(new Float32Array(1));
}, 'createIIRFilter(new Float32Array(1))').throw(TypeError);
should(function() {
// null is not valid
context.createIIRFilter(null, null);
}, 'createIIRFilter(null, null)').throw(TypeError);
should(function() {
// There has to be at least one coefficient.
context.createIIRFilter([], []);
}, 'createIIRFilter([], [])').throw(DOMException, 'NotSupportedError');
should(function() {
// There has to be at least one coefficient.
context.createIIRFilter([1], []);
}, 'createIIRFilter([1], [])').throw(DOMException, 'NotSupportedError');
should(function() {
// There has to be at least one coefficient.
context.createIIRFilter([], [1]);
}, 'createIIRFilter([], [1])').throw(DOMException, 'NotSupportedError');
should(
function() {
// Max allowed size for the coefficient arrays.
let fb = new Float32Array(20);
fb[0] = 1;
context.createIIRFilter(fb, fb);
},
'createIIRFilter(new Float32Array(20), new Float32Array(20))')
.notThrow();
should(
function() {
// Max allowed size for the feedforward coefficient array.
let coef = new Float32Array(21);
coef[0] = 1;
context.createIIRFilter(coef, [1]);
},
'createIIRFilter(new Float32Array(21), [1])')
.throw(DOMException, 'NotSupportedError');
should(
function() {
// Max allowed size for the feedback coefficient array.
let coef = new Float32Array(21);
coef[0] = 1;
context.createIIRFilter([1], coef);
},
'createIIRFilter([1], new Float32Array(21))')
.throw(DOMException, 'NotSupportedError');
should(
function() {
// First feedback coefficient can't be 0.
context.createIIRFilter([1], new Float32Array(2));
},
'createIIRFilter([1], new Float32Array(2))')
.throw(DOMException, 'InvalidStateError');
should(
function() {
// feedforward coefficients can't all be zero.
context.createIIRFilter(new Float32Array(10), [1]);
},
'createIIRFilter(new Float32Array(10), [1])')
.throw(DOMException, 'InvalidStateError');
should(function() {
// Feedback coefficients must be finite.
context.createIIRFilter([1], [1, Infinity, NaN]);
}, 'createIIRFilter([1], [1, NaN, Infinity])').throw(TypeError);
should(function() {
// Feedforward coefficients must be finite.
context.createIIRFilter([1, Infinity, NaN], [1]);
}, 'createIIRFilter([1, NaN, Infinity], [1])').throw(TypeError);
should(function() {
// Test that random junk in the array is converted to NaN.
context.createIIRFilter([1, 'abc', []], [1]);
}, 'createIIRFilter([1, \'abc\', []], [1])').throw(TypeError);
task.done();
});
audit.define('exceptions-getFrequencyData', (task, should) => {
// Create a really simple IIR filter. Doesn't much matter what.
let coef = Float32Array.from([1]);
let f = context.createIIRFilter(coef, coef);
should(
function() {
// frequencyHz can't be null.
f.getFrequencyResponse(
null, new Float32Array(1), new Float32Array(1));
},
'getFrequencyResponse(null, new Float32Array(1), new Float32Array(1))')
.throw(TypeError);
should(
function() {
// magResponse can't be null.
f.getFrequencyResponse(
new Float32Array(1), null, new Float32Array(1));
},
'getFrequencyResponse(new Float32Array(1), null, new Float32Array(1))')
.throw(TypeError);
should(
function() {
// phaseResponse can't be null.
f.getFrequencyResponse(
new Float32Array(1), new Float32Array(1), null);
},
'getFrequencyResponse(new Float32Array(1), new Float32Array(1), null)')
.throw(TypeError);
should(
function() {
// magResponse array must the same length as frequencyHz
f.getFrequencyResponse(
new Float32Array(10), new Float32Array(1),
new Float32Array(20));
},
'getFrequencyResponse(new Float32Array(10), new Float32Array(1), new Float32Array(20))')
.throw(DOMException, 'InvalidAccessError');
should(
function() {
// phaseResponse array must be the same length as frequencyHz
f.getFrequencyResponse(
new Float32Array(10), new Float32Array(20),
new Float32Array(1));
},
'getFrequencyResponse(new Float32Array(10), new Float32Array(20), new Float32Array(1))')
.throw(DOMException, 'InvalidAccessError');
task.done();
});
audit.run();
</script>
</body>
</html>