Update web-platform-tests to revision 9659a35d816ff1b32835a2eccf3e0117dea4e5ce

This commit is contained in:
WPT Sync Bot 2018-02-26 20:17:41 -05:00
parent 6df0dc5b27
commit 4f0af2af66
54 changed files with 1873 additions and 137 deletions

View file

@ -0,0 +1,49 @@
<!DOCTYPE html>
<html>
<head>
<title>
delaynode-max-default-delay.html
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/resources/audit-util.js"></script>
<script src="/webaudio/resources/audit.js"></script>
<script src="/webaudio/resources/delay-testing.js"></script>
</head>
<body>
<script id="layout-test-code">
let audit = Audit.createTaskRunner();
audit.define(
{
label: 'test',
description: 'DelayNode with delay set to default maximum delay'
},
function(task, should) {
// Create offline audio context.
let context = new OfflineAudioContext(
1, sampleRate * renderLengthSeconds, sampleRate);
let toneBuffer = createToneBuffer(
context, 20, 20 * toneLengthSeconds, sampleRate); // 20Hz tone
let bufferSource = context.createBufferSource();
bufferSource.buffer = toneBuffer;
let delay = context.createDelay();
delayTimeSeconds = 1;
delay.delayTime.value = delayTimeSeconds;
bufferSource.connect(delay);
delay.connect(context.destination);
bufferSource.start(0);
context.startRendering()
.then(buffer => checkDelayedResult(buffer, toneBuffer, should))
.then(() => task.done());
});
audit.run();
</script>
</body>
</html>

View file

@ -0,0 +1,51 @@
<!DOCTYPE html>
<html>
<head>
<title>
delaynode-max-nondefault-delay.html
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/resources/audit-util.js"></script>
<script src="/webaudio/resources/audit.js"></script>
<script src="/webaudio/resources/delay-testing.js"></script>
</head>
<body>
<script id="layout-test-code">
let audit = Audit.createTaskRunner();
audit.define(
{
label: 'test',
description: 'DelayNode with delay set to non-default maximum delay'
},
function(task, should) {
// Create offline audio context.
let context = new OfflineAudioContext(
1, sampleRate * renderLengthSeconds, sampleRate);
let toneBuffer = createToneBuffer(
context, 20, 20 * toneLengthSeconds, sampleRate); // 20Hz tone
let bufferSource = context.createBufferSource();
bufferSource.buffer = toneBuffer;
let maxDelay = 1.5;
let delay = context.createDelay(maxDelay);
delayTimeSeconds = maxDelay;
delay.delayTime.value = delayTimeSeconds;
bufferSource.connect(delay);
delay.connect(context.destination);
bufferSource.start(0);
context.startRendering()
.then(buffer => checkDelayedResult(buffer, toneBuffer, should))
.then(() => task.done());
;
});
audit.run();
</script>
</body>
</html>

View file

@ -0,0 +1,54 @@
<!DOCTYPE html>
<html>
<head>
<title>
delaynode-maxdelay.html
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/resources/audit-util.js"></script>
<script src="/webaudio/resources/audit.js"></script>
<script src="/webaudio/resources/delay-testing.js"></script>
</head>
<body>
<script id="layout-test-code">
let audit = Audit.createTaskRunner();
audit.define(
{
label: 'test',
description:
'Basic functionality of DelayNode with a non-default max delay time'
},
function(task, should) {
// Create offline audio context.
let context = new OfflineAudioContext(
1, sampleRate * renderLengthSeconds, sampleRate);
let toneBuffer = createToneBuffer(
context, 20, 20 * toneLengthSeconds, sampleRate); // 20Hz tone
let bufferSource = context.createBufferSource();
bufferSource.buffer = toneBuffer;
// Create a delay node with an explicit max delay time (greater than
// the default of 1 second).
let delay = context.createDelay(2);
// Set the delay time to a value greater than the default max delay
// so we can verify the delay is working for this case.
delayTimeSeconds = 1.5;
delay.delayTime.value = delayTimeSeconds;
bufferSource.connect(delay);
delay.connect(context.destination);
bufferSource.start(0);
context.startRendering()
.then(buffer => checkDelayedResult(buffer, toneBuffer, should))
.then(() => task.done());
});
audit.run();
</script>
</body>
</html>

View file

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html>
<head>
<title>
delaynode-maxdelaylimit.html
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/resources/audit-util.js"></script>
<script src="/webaudio/resources/audit.js"></script>
<script src="/webaudio/resources/delay-testing.js"></script>
</head>
<body>
<script id="layout-test-code">
let audit = Audit.createTaskRunner();
audit.define(
{
label: 'test',
description:
'Tests attribute and maximum allowed delay of DelayNode'
},
function(task, should) {
// Create offline audio context.
let context = new OfflineAudioContext(
1, sampleRate * renderLengthSeconds, sampleRate);
let toneBuffer = createToneBuffer(
context, 20, 20 * toneLengthSeconds, sampleRate); // 20Hz tone
let bufferSource = context.createBufferSource();
bufferSource.buffer = toneBuffer;
window.context = context;
should(() => context.createDelay(180)).throw();
should(() => context.createDelay(0)).throw();
should(() => context.createDelay(-1)).throw();
should(() => context.createDelay(NaN)).throw();
;
let delay = context.createDelay(179);
delay.delayTime.value = delayTimeSeconds;
window.delay = delay;
should(
delay.delayTime.value,
'delay.delayTime.value = ' + delayTimeSeconds)
.beEqualTo(delayTimeSeconds);
bufferSource.connect(delay);
delay.connect(context.destination);
bufferSource.start(0);
context.startRendering()
.then(buffer => checkDelayedResult(buffer, toneBuffer, should))
.then(() => task.done());
});
audit.run();
</script>
</body>
</html>

View file

@ -0,0 +1,51 @@
<!DOCTYPE html>
<html>
<head>
<title>
delaynode-scheduling.html
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/resources/audit-util.js"></script>
<script src="/webaudio/resources/audit.js"></script>
<script src="/webaudio/resources/delay-testing.js"></script>
</head>
<body>
<script id="layout-test-code">
let audit = Audit.createTaskRunner();
audit.define(
{
label: 'test',
description:
'DelayNode delayTime parameter can be scheduled at a given time'
},
function(task, should) {
// Create offline audio context.
let context = new OfflineAudioContext(
1, sampleRate * renderLengthSeconds, sampleRate);
let toneBuffer = createToneBuffer(
context, 20, 20 * toneLengthSeconds, sampleRate); // 20Hz tone
let bufferSource = context.createBufferSource();
bufferSource.buffer = toneBuffer;
let delay = context.createDelay();
// Schedule delay time at time zero.
delay.delayTime.setValueAtTime(delayTimeSeconds, 0);
bufferSource.connect(delay);
delay.connect(context.destination);
bufferSource.start(0);
context.startRendering()
.then(buffer => checkDelayedResult(buffer, toneBuffer, should))
.then(() => task.done());
});
audit.run();
</script>
</body>
</html>

View file

@ -0,0 +1,61 @@
<!DOCTYPE html>
<html>
<head>
<title>
delaynode.html
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/resources/audit-util.js"></script>
<script src="/webaudio/resources/audit.js"></script>
<script src="/webaudio/resources/delay-testing.js"></script>
</head>
<body>
<script id="layout-test-code">
let audit = Audit.createTaskRunner();
audit.define(
{
label: 'test',
description: 'Tests attribute and basic functionality of DelayNode'
},
function(task, should) {
// Create offline audio context.
let context = new OfflineAudioContext(
1, sampleRate * renderLengthSeconds, sampleRate);
let toneBuffer = createToneBuffer(
context, 20, 20 * toneLengthSeconds, sampleRate); // 20Hz tone
let bufferSource = context.createBufferSource();
bufferSource.buffer = toneBuffer;
let delay = context.createDelay();
window.delay = delay;
should(delay.numberOfInputs, 'delay.numberOfInputs').beEqualTo(1);
should(delay.numberOfOutputs, 'delay.numberOfOutputs').beEqualTo(1);
should(delay.delayTime.defaultValue, 'delay.delayTime.defaultValue')
.beEqualTo(0.0);
should(delay.delayTime.value, 'delay.delayTime.value')
.beEqualTo(0.0);
delay.delayTime.value = delayTimeSeconds;
should(
delay.delayTime.value,
'delay.delayTime.value = ' + delayTimeSeconds)
.beEqualTo(delayTimeSeconds);
bufferSource.connect(delay);
delay.connect(context.destination);
bufferSource.start(0);
context.startRendering()
.then(buffer => checkDelayedResult(buffer, toneBuffer, should))
.then(task.done.bind(task));
});
audit.run();
</script>
</body>
</html>

View file

@ -0,0 +1,183 @@
<!DOCTYPE html>
<html>
<head>
<title>
Test DelayNode Has No Dezippering
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/resources/audit-util.js"></script>
<script src="/webaudio/resources/audit.js"></script>
</head>
<body>
<script id="layout-test-code">
// The sample rate must be a power of two to avoid any round-off errors in
// computing when to suspend a context on a rendering quantum boundary.
// Otherwise this is pretty arbitrary.
let sampleRate = 16384;
let audit = Audit.createTaskRunner();
audit.define(
{label: 'test0', description: 'Test DelayNode has no dezippering'},
(task, should) => {
let context = new OfflineAudioContext(1, sampleRate, sampleRate);
// Simple integer ramp for testing delay node
let buffer = new AudioBuffer(
{length: context.length, sampleRate: context.sampleRate});
let rampData = buffer.getChannelData(0);
for (let k = 0; k < rampData.length; ++k) {
rampData[k] = k + 1;
}
// |delay0Frame| is the initial delay in frames. |delay1Frame| is
// the new delay in frames. These must be integers.
let delay0Frame = 64;
let delay1Frame = 16;
let src = new AudioBufferSourceNode(context, {buffer: buffer});
let delay = new DelayNode(
context, {delayTime: delay0Frame / context.sampleRate});
src.connect(delay).connect(context.destination);
// After a render quantum, change the delay to |delay1Frame|.
context.suspend(RENDER_QUANTUM_FRAMES / context.sampleRate)
.then(() => {
delay.delayTime.value = delay1Frame / context.sampleRate;
})
.then(() => context.resume());
src.start();
context.startRendering()
.then(renderedBuffer => {
let renderedData = renderedBuffer.getChannelData(0);
// The first |delay0Frame| frames should be zero.
should(
renderedData.slice(0, delay0Frame),
'output[0:' + (delay0Frame - 1) + ']')
.beConstantValueOf(0);
// Now we have the ramp should show up from the delay.
let ramp0 =
new Float32Array(RENDER_QUANTUM_FRAMES - delay0Frame);
for (let k = 0; k < ramp0.length; ++k) {
ramp0[k] = rampData[k];
}
should(
renderedData.slice(delay0Frame, RENDER_QUANTUM_FRAMES),
'output[' + delay0Frame + ':' +
(RENDER_QUANTUM_FRAMES - 1) + ']')
.beEqualToArray(ramp0);
// After one rendering quantum, the delay is changed to
// |delay1Frame|.
let ramp1 =
new Float32Array(context.length - RENDER_QUANTUM_FRAMES);
for (let k = 0; k < ramp1.length; ++k) {
// ramp1[k] = 1 + k + RENDER_QUANTUM_FRAMES - delay1Frame;
ramp1[k] =
rampData[k + RENDER_QUANTUM_FRAMES - delay1Frame];
}
should(
renderedData.slice(RENDER_QUANTUM_FRAMES),
'output[' + RENDER_QUANTUM_FRAMES + ':]')
.beEqualToArray(ramp1);
})
.then(() => task.done());
});
audit.define(
{label: 'test1', description: 'Test value setter and setValueAtTime'},
(task, should) => {
testWithAutomation(should, {prefix: ''}).then(() => task.done());
});
audit.define(
{label: 'test2', description: 'Test value setter and modulation'},
(task, should) => {
testWithAutomation(should, {
prefix: 'With modulation: ',
modulator: true
}).then(() => task.done());
});
// Compare .value setter with setValueAtTime, Optionally allow modulation
// of |delayTime|.
function testWithAutomation(should, options) {
let prefix = options.prefix;
// Channel 0 is the output of delay node using the setter and channel 1
// is the output using setValueAtTime.
let context = new OfflineAudioContext(2, sampleRate, sampleRate);
let merger = new ChannelMergerNode(
context, {numberOfInputs: context.destination.channelCount});
merger.connect(context.destination);
let src = new OscillatorNode(context);
// |delay0Frame| is the initial delay value in frames. |delay1Frame| is
// the new delay in frames. The values here are constrained only by the
// constraints for a DelayNode. These are pretty arbitrary except we
// wanted them to be fractional so as not be on a frame boundary to
// test interpolation compared with |setValueAtTime()|..
let delay0Frame = 3.1;
let delay1Frame = 47.2;
let delayTest = new DelayNode(
context, {delayTime: delay0Frame / context.sampleRate});
let delayRef = new DelayNode(
context, {delayTime: delay0Frame / context.sampleRate});
src.connect(delayTest).connect(merger, 0, 0);
src.connect(delayRef).connect(merger, 0, 1);
if (options.modulator) {
// Fairly arbitrary modulation of the delay time, with a peak
// variation of 10 ms.
let mod = new OscillatorNode(context, {frequency: 1000});
let modGain = new GainNode(context, {gain: .01});
mod.connect(modGain);
modGain.connect(delayTest.delayTime);
modGain.connect(delayRef.delayTime);
mod.start();
}
// The time at which the delay time of |delayTest| node will be
// changed. This MUST be on a render quantum boundary, but is
// otherwise arbitrary.
let changeTime = 3 * RENDER_QUANTUM_FRAMES / context.sampleRate;
// Schedule the delay change on |delayRef| and also apply the value
// setter for |delayTest| at |changeTime|.
delayRef.delayTime.setValueAtTime(
delay1Frame / context.sampleRate, changeTime);
context.suspend(changeTime)
.then(() => {
delayTest.delayTime.value = delay1Frame / context.sampleRate;
})
.then(() => context.resume());
src.start();
return context.startRendering().then(renderedBuffer => {
let actual = renderedBuffer.getChannelData(0);
let expected = renderedBuffer.getChannelData(1);
let match = should(actual, prefix + '.value setter output')
.beEqualToArray(expected);
should(
match,
prefix + '.value setter output matches setValueAtTime output')
.beTrue();
});
}
audit.run();
</script>
</body>
</html>