<!DOCTYPE html>
<html>
<head>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
</head>
<body>
<script type="module">
import {MockMIDIService} from './resources/mock-midiservice.js';
const mock = new MockMIDIService();
// See https://www.midi.org/specifications/item/table-1-summary-of-midi-message
const systemMessages = (function(messages) {
// Prepare various combinations of messages from input message array.
let combinations = [];
for (let i = 0; i < messages.length; ++i) {
combinations.push(messages[i]);
for (let j = 0; j < messages.length; ++j) {
combinations.push(messages[i].concat(messages[j]));
for (let k = 0; k < messages.length; ++k) {
combinations.push(messages[i].concat(messages[j], messages[k]));
}
}
}
return combinations;
})([[0xf1, 0x00],
[0xf2, 0x00, 0x00],
[0xf3, 0x00],
[0xf6]]);
const reservedSystemMessages = [[0xf4], [0xf5]];
const systemExclusiveMessages = [[0xf0, 0xf7], [0xf0, 0x00, 0xf7]];
promise_test(async _ => {
await test_driver.set_permission({name: 'midi', sysex: true}, 'granted');
const access = await navigator.requestMIDIAccess();
const output = access.outputs.values().next().value;
for (const message of systemMessages) {
output.send(message);
}
for (const message of reservedSystemMessages) {
assert_throws_js(TypeError, () => output.send(message));
}
for (const message of systemExclusiveMessages) {
assert_throws_dom('InvalidAccessError', () => output.send(message));
}
}, 'various types of system messages can be validated');
</script>
</body>
</html>