| export async function checkStateTransition(options) { |
| const port = options.port; |
| const access = options.access; |
| assert_equals(options.initialconnection, port.connection); |
| const checkHandler = function(e) { |
| assert_not_equals(options.initialconnection, options.finalconnection); |
| assert_equals(e.port.id, options.port.id); |
| assert_equals(e.port.connection, options.finalconnection); |
| }; |
| const portPromise = new Promise(resolve => { |
| port.onstatechange = e => { |
| checkHandler(e); |
| resolve(); |
| }; |
| }); |
| const accessPromise = new Promise(resolve => { |
| access.onstatechange = e => { |
| checkHandler(e); |
| resolve(); |
| }; |
| }); |
| if (options.method == "setonmidimessage") { |
| port.onmidimessage = function() {}; |
| return Promise.all([portPromise, accessPromise]); |
| } |
| if (options.method == "addeventlistener") { |
| port.addEventListener("midimessage", function() {}); |
| return Promise.all([portPromise, accessPromise]); |
| } |
| if (options.method == "send") { |
| port.send([]); |
| return Promise.all([portPromise, accessPromise]); |
| } |
| |
| // |method| is expected to be "open" or "close". |
| const p = await port[options.method](); |
| assert_equals(p.id, options.port.id); |
| assert_equals(p.connection, options.finalconnection); |
| assert_equals(port.connection, options.finalconnection); |
| } |