| <!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> |