(seed: number)
| 132 | } |
| 133 | |
| 134 | function runTest(seed: number) { |
| 135 | reseed(seed) |
| 136 | const server = new TestServer(schema) |
| 137 | const instance = new FuzzTestInstance(seed, server) |
| 138 | |
| 139 | const peers = [instance, new FuzzTestInstance(instance.randomInt(), server)] |
| 140 | const numExtraPeers = instance.randomInt(MAX_PEERS - 2) |
| 141 | for (let i = 0; i < numExtraPeers; i++) { |
| 142 | peers.push(new FuzzTestInstance(instance.randomInt(), server)) |
| 143 | } |
| 144 | |
| 145 | const allOk = (when: string) => { |
| 146 | if (peers.some((p) => p.editor?.editor && !p.editor?.editor.getCurrentPage())) { |
| 147 | throw new Error(`not all peer editors have current page (${when})`) |
| 148 | } |
| 149 | if (peers.some((p) => p.editor?.editor && !p.editor?.editor.getCurrentPageState())) { |
| 150 | throw new Error(`not all peer editors have page states (${when})`) |
| 151 | } |
| 152 | if ( |
| 153 | peers.some( |
| 154 | (p) => p.client.isConnectedToRoom && p.socketPair.clientSocket.connectionStatus !== 'online' |
| 155 | ) |
| 156 | ) { |
| 157 | throw new Error(`peer client connection status mismatch (${when})`) |
| 158 | } |
| 159 | if (peers.some((p) => p.editor?.editor && !arrowsAreSound(p.editor.editor))) { |
| 160 | throw new Error(`peer editor arrows are not sound (${when})`) |
| 161 | } |
| 162 | const numOtherPeersConnected = peers.filter((p) => p.hasLoaded).length - 1 |
| 163 | if ( |
| 164 | peers.some( |
| 165 | (p) => |
| 166 | p.hasLoaded && |
| 167 | p.editor?.editor.store.query.ids('instance_presence').get().size !== |
| 168 | numOtherPeersConnected |
| 169 | ) |
| 170 | ) { |
| 171 | throw new Error(`not all peer editors have instance presence (${when})`) |
| 172 | } |
| 173 | } |
| 174 | |
| 175 | const ops: Array<{ peerId: string; op: Op; id: number }> = [] |
| 176 | try { |
| 177 | for (let i = 0; i < NUM_OPS_PER_TEST; i++) { |
| 178 | const peer = peers[instance.randomInt(peers.length)] |
| 179 | |
| 180 | if (peer.editor) { |
| 181 | const op = peer.editor.getRandomOp() |
| 182 | ops.push({ peerId: peer.id, op, id: ops.length }) |
| 183 | |
| 184 | allOk('before applyOp') |
| 185 | peer.editor.applyOp(op) |
| 186 | assertPeerStoreIsUsable(peer) |
| 187 | allOk('after applyOp') |
| 188 | |
| 189 | server.flushDebouncingMessages() |
| 190 | |
| 191 | if (peer.socketPair.isConnected && peer.randomInt(6) === 0) { |
no test coverage detected
searching dependent graphs…