blob: f62d869215de2a7ada85911cea259c1a607d95b7 [file] [log] [blame]
<!doctype html>
<html>
<head>
<title>
Test Warning Messages for Value Setter are Produced
</title>
<script src="../../imported/w3c/web-platform-tests/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 audit = Audit.createTaskRunner({requireResultFile: true});
audit.define({label: 'test-0'}, (task, should) => {
runTest(
task.label, should,
[
{methodName: 'setValueAtTime', args: [0, 0]},
{methodName: 'setValueAtTime', args: [1, 0.2]},
{methodName: 'linearRampToValueAtTime', args: [99, 0.7]},
],
[
// No overlap, so no warning
{time: 0.1, value: -1},
// Overlaps setValue to linearRamp
{time: 0.5, value: 99},
// Past end of linearRamp, so no warning
{time: 0.9, value: 50}
])
.then(() => task.done());
});
audit.define({label: 'test-1'}, (task, should) => {
runTest(
task.label, should,
[
{methodName: 'setValueAtTime', args: [0, 0]},
{methodName: 'linearRampToValueAtTime', args: [1, 0.21]},
{methodName: 'linearRampToValueAtTime', args: [99, 0.71]},
],
[
// Overlaps setValue to linearRamp
{time: 0.1, value: -1},
// Overlaps linearRamp to linearRamp
{time: 0.5, value: 99},
// Past end of linearRamp, so no warning
{time: 0.9, value: 50}
])
.then(() => task.done());
});
audit.define({label: 'test-2'}, (task, should) => {
runTest(
task.label, should,
[
{methodName: 'setValueAtTime', args: [0, 0]},
{methodName: 'linearRampToValueAtTime', args: [1, 0.22]},
{methodName: 'setValueAtTime', args: [99, 0.72]},
],
[
// Overlaps setValue to linearRamp
{time: 0.1, value: -1},
// Between end of linearRamp and start of setValue, so no warning.
{time: 0.5, value: 99},
])
.then(() => task.done());
});
audit.define({label: 'test-3'}, (task, should) => {
runTest(
task.label, should,
[
{methodName: 'setValueAtTime', args: [0, 0]},
{methodName: 'linearRampToValueAtTime', args: [1, 0.23]},
{methodName: 'setValueAtTime', args: [99, 0.73]},
],
[
// Overlaps setValue to linearRamp
{time: 0.1, value: -1},
// Between end of linearRamp and start of setValue, so no warning.
{time: 0.5, value: 99},
])
.then(() => task.done());
});
audit.define({label: 'test-4'}, (task, should) => {
runTest(
task.label, should,
[
{methodName: 'setValueAtTime', args: [0, 0]},
{methodName: 'setTargetAtTime', args: [1, 0.24, .1]},
],
[
// No overlap.
{time: 0.1, value: -1},
// Overlaps setTarget
{time: 0.5, value: 99},
])
.then(() => task.done());
});
audit.define({label: 'test-5'}, (task, should) => {
runTest(
task.label, should,
[
{methodName: 'setValueAtTime', args: [0, 0]},
{methodName: 'setValueCurveAtTime', args: [[1, 2, 3], 0.25, .5]},
],
[
// No overlap.
{time: 0.1, value: -1},
// Overlaps setValueCurve
{time: 0.5, value: 99, shouldThrow: true},
// Past end of setValueCurve, so no warning
{time: .9, value: 50}
])
.then(() => task.done());
});
audit.run();
// Run test with automations given in |automationList| and with value
// setters given in |valueSetterList|.
function runTest(taskLabel, should, automationList, valueSetterList) {
// This log message is to make it easier to see where the warnings
// messages come from in the logs.
console.log('Test: ' + taskLabel);
// Fairly arbitrary duration and sample rate.
let context = new OfflineAudioContext(1, 48000, 48000);
// For simplicity, just do the automations on a ConstantSourceNode.
let src = new ConstantSourceNode(context);
src.connect(context.destination);
// Set up automations.
for (let item of automationList) {
src.offset[item.methodName](...item.args);
}
// Suspend the context at the specified times and directly set the
// value.
for (let item of valueSetterList) {
context.suspend(item.time)
.then(() => {
if (item.shouldThrow === true) {
should(() => src.offset.value = item.value,
'Value setter overlaps setValueCurve')
.throw(DOMException, 'NotSupportedError');
} else {
src.offset.value = item.value;
}
})
.then(() => context.resume());
}
src.start();
return context.startRendering().then(() => {
should(true, taskLabel).message(': rendered successfully', 'FAILED');
});
}
</script>
</body>
</html>