yjs/dist/testHelper.mjs.map
jsingleton20 4f2affd4cd again
2023-05-09 13:36:33 -04:00

1 line
30 KiB
Plaintext

{"version":3,"file":"testHelper.mjs","sources":["../tests/testHelper.js"],"sourcesContent":["\nimport * as t from 'lib0/testing'\nimport * as prng from 'lib0/prng'\nimport * as encoding from 'lib0/encoding'\nimport * as decoding from 'lib0/decoding'\nimport * as syncProtocol from 'y-protocols/sync'\nimport * as object from 'lib0/object'\nimport * as map from 'lib0/map'\nimport * as Y from '../src/index.js'\nexport * from '../src/index.js'\n\nif (typeof window !== 'undefined') {\n // @ts-ignore\n window.Y = Y // eslint-disable-line\n}\n\n/**\n * @param {TestYInstance} y // publish message created by `y` to all other online clients\n * @param {Uint8Array} m\n */\nconst broadcastMessage = (y, m) => {\n if (y.tc.onlineConns.has(y)) {\n y.tc.onlineConns.forEach(remoteYInstance => {\n if (remoteYInstance !== y) {\n remoteYInstance._receive(m, y)\n }\n })\n }\n}\n\nexport let useV2 = false\n\nexport const encV1 = {\n encodeStateAsUpdate: Y.encodeStateAsUpdate,\n mergeUpdates: Y.mergeUpdates,\n applyUpdate: Y.applyUpdate,\n logUpdate: Y.logUpdate,\n updateEventName: 'update',\n diffUpdate: Y.diffUpdate\n}\n\nexport const encV2 = {\n encodeStateAsUpdate: Y.encodeStateAsUpdateV2,\n mergeUpdates: Y.mergeUpdatesV2,\n applyUpdate: Y.applyUpdateV2,\n logUpdate: Y.logUpdateV2,\n updateEventName: 'updateV2',\n diffUpdate: Y.diffUpdateV2\n}\n\nexport let enc = encV1\n\nconst useV1Encoding = () => {\n useV2 = false\n enc = encV1\n}\n\nconst useV2Encoding = () => {\n console.error('sync protocol doesnt support v2 protocol yet, fallback to v1 encoding') // @Todo\n useV2 = false\n enc = encV1\n}\n\nexport class TestYInstance extends Y.Doc {\n /**\n * @param {TestConnector} testConnector\n * @param {number} clientID\n */\n constructor (testConnector, clientID) {\n super()\n this.userID = clientID // overwriting clientID\n /**\n * @type {TestConnector}\n */\n this.tc = testConnector\n /**\n * @type {Map<TestYInstance, Array<Uint8Array>>}\n */\n this.receiving = new Map()\n testConnector.allConns.add(this)\n /**\n * The list of received updates.\n * We are going to merge them later using Y.mergeUpdates and check if the resulting document is correct.\n * @type {Array<Uint8Array>}\n */\n this.updates = []\n // set up observe on local model\n this.on(enc.updateEventName, /** @param {Uint8Array} update @param {any} origin */ (update, origin) => {\n if (origin !== testConnector) {\n const encoder = encoding.createEncoder()\n syncProtocol.writeUpdate(encoder, update)\n broadcastMessage(this, encoding.toUint8Array(encoder))\n }\n this.updates.push(update)\n })\n this.connect()\n }\n\n /**\n * Disconnect from TestConnector.\n */\n disconnect () {\n this.receiving = new Map()\n this.tc.onlineConns.delete(this)\n }\n\n /**\n * Append yourself to the list of known Y instances in testconnector.\n * Also initiate sync with all clients.\n */\n connect () {\n if (!this.tc.onlineConns.has(this)) {\n this.tc.onlineConns.add(this)\n const encoder = encoding.createEncoder()\n syncProtocol.writeSyncStep1(encoder, this)\n // publish SyncStep1\n broadcastMessage(this, encoding.toUint8Array(encoder))\n this.tc.onlineConns.forEach(remoteYInstance => {\n if (remoteYInstance !== this) {\n // remote instance sends instance to this instance\n const encoder = encoding.createEncoder()\n syncProtocol.writeSyncStep1(encoder, remoteYInstance)\n this._receive(encoding.toUint8Array(encoder), remoteYInstance)\n }\n })\n }\n }\n\n /**\n * Receive a message from another client. This message is only appended to the list of receiving messages.\n * TestConnector decides when this client actually reads this message.\n *\n * @param {Uint8Array} message\n * @param {TestYInstance} remoteClient\n */\n _receive (message, remoteClient) {\n map.setIfUndefined(this.receiving, remoteClient, () => /** @type {Array<Uint8Array>} */ ([])).push(message)\n }\n}\n\n/**\n * Keeps track of TestYInstances.\n *\n * The TestYInstances add/remove themselves from the list of connections maiained in this object.\n * I think it makes sense. Deal with it.\n */\nexport class TestConnector {\n /**\n * @param {prng.PRNG} gen\n */\n constructor (gen) {\n /**\n * @type {Set<TestYInstance>}\n */\n this.allConns = new Set()\n /**\n * @type {Set<TestYInstance>}\n */\n this.onlineConns = new Set()\n /**\n * @type {prng.PRNG}\n */\n this.prng = gen\n }\n\n /**\n * Create a new Y instance and add it to the list of connections\n * @param {number} clientID\n */\n createY (clientID) {\n return new TestYInstance(this, clientID)\n }\n\n /**\n * Choose random connection and flush a random message from a random sender.\n *\n * If this function was unable to flush a message, because there are no more messages to flush, it returns false. true otherwise.\n * @return {boolean}\n */\n flushRandomMessage () {\n const gen = this.prng\n const conns = Array.from(this.onlineConns).filter(conn => conn.receiving.size > 0)\n if (conns.length > 0) {\n const receiver = prng.oneOf(gen, conns)\n const [sender, messages] = prng.oneOf(gen, Array.from(receiver.receiving))\n const m = messages.shift()\n if (messages.length === 0) {\n receiver.receiving.delete(sender)\n }\n if (m === undefined) {\n return this.flushRandomMessage()\n }\n const encoder = encoding.createEncoder()\n // console.log('receive (' + sender.userID + '->' + receiver.userID + '):\\n', syncProtocol.stringifySyncMessage(decoding.createDecoder(m), receiver))\n // do not publish data created when this function is executed (could be ss2 or update message)\n syncProtocol.readSyncMessage(decoding.createDecoder(m), encoder, receiver, receiver.tc)\n if (encoding.length(encoder) > 0) {\n // send reply message\n sender._receive(encoding.toUint8Array(encoder), receiver)\n }\n return true\n }\n return false\n }\n\n /**\n * @return {boolean} True iff this function actually flushed something\n */\n flushAllMessages () {\n let didSomething = false\n while (this.flushRandomMessage()) {\n didSomething = true\n }\n return didSomething\n }\n\n reconnectAll () {\n this.allConns.forEach(conn => conn.connect())\n }\n\n disconnectAll () {\n this.allConns.forEach(conn => conn.disconnect())\n }\n\n syncAll () {\n this.reconnectAll()\n this.flushAllMessages()\n }\n\n /**\n * @return {boolean} Whether it was possible to disconnect a randon connection.\n */\n disconnectRandom () {\n if (this.onlineConns.size === 0) {\n return false\n }\n prng.oneOf(this.prng, Array.from(this.onlineConns)).disconnect()\n return true\n }\n\n /**\n * @return {boolean} Whether it was possible to reconnect a random connection.\n */\n reconnectRandom () {\n /**\n * @type {Array<TestYInstance>}\n */\n const reconnectable = []\n this.allConns.forEach(conn => {\n if (!this.onlineConns.has(conn)) {\n reconnectable.push(conn)\n }\n })\n if (reconnectable.length === 0) {\n return false\n }\n prng.oneOf(this.prng, reconnectable).connect()\n return true\n }\n}\n\n/**\n * @template T\n * @param {t.TestCase} tc\n * @param {{users?:number}} conf\n * @param {InitTestObjectCallback<T>} [initTestObject]\n * @return {{testObjects:Array<any>,testConnector:TestConnector,users:Array<TestYInstance>,array0:Y.Array<any>,array1:Y.Array<any>,array2:Y.Array<any>,map0:Y.Map<any>,map1:Y.Map<any>,map2:Y.Map<any>,map3:Y.Map<any>,text0:Y.Text,text1:Y.Text,text2:Y.Text,xml0:Y.XmlElement,xml1:Y.XmlElement,xml2:Y.XmlElement}}\n */\nexport const init = (tc, { users = 5 } = {}, initTestObject) => {\n /**\n * @type {Object<string,any>}\n */\n const result = {\n users: []\n }\n const gen = tc.prng\n // choose an encoding approach at random\n if (prng.bool(gen)) {\n useV2Encoding()\n } else {\n useV1Encoding()\n }\n\n const testConnector = new TestConnector(gen)\n result.testConnector = testConnector\n for (let i = 0; i < users; i++) {\n const y = testConnector.createY(i)\n y.clientID = i\n result.users.push(y)\n result['array' + i] = y.getArray('array')\n result['map' + i] = y.getMap('map')\n result['xml' + i] = y.get('xml', Y.XmlElement)\n result['text' + i] = y.getText('text')\n }\n testConnector.syncAll()\n result.testObjects = result.users.map(initTestObject || (() => null))\n useV1Encoding()\n return /** @type {any} */ (result)\n}\n\n/**\n * 1. reconnect and flush all\n * 2. user 0 gc\n * 3. get type content\n * 4. disconnect & reconnect all (so gc is propagated)\n * 5. compare os, ds, ss\n *\n * @param {Array<TestYInstance>} users\n */\nexport const compare = users => {\n users.forEach(u => u.connect())\n while (users[0].tc.flushAllMessages()) {} // eslint-disable-line\n // For each document, merge all received document updates with Y.mergeUpdates and create a new document which will be added to the list of \"users\"\n // This ensures that mergeUpdates works correctly\n const mergedDocs = users.map(user => {\n const ydoc = new Y.Doc()\n enc.applyUpdate(ydoc, enc.mergeUpdates(user.updates))\n return ydoc\n })\n users.push(.../** @type {any} */(mergedDocs))\n const userArrayValues = users.map(u => u.getArray('array').toJSON())\n const userMapValues = users.map(u => u.getMap('map').toJSON())\n const userXmlValues = users.map(u => u.get('xml', Y.XmlElement).toString())\n const userTextValues = users.map(u => u.getText('text').toDelta())\n for (const u of users) {\n t.assert(u.store.pendingDs === null)\n t.assert(u.store.pendingStructs === null)\n }\n // Test Array iterator\n t.compare(users[0].getArray('array').toArray(), Array.from(users[0].getArray('array')))\n // Test Map iterator\n const ymapkeys = Array.from(users[0].getMap('map').keys())\n t.assert(ymapkeys.length === Object.keys(userMapValues[0]).length)\n ymapkeys.forEach(key => t.assert(object.hasProperty(userMapValues[0], key)))\n /**\n * @type {Object<string,any>}\n */\n const mapRes = {}\n for (const [k, v] of users[0].getMap('map')) {\n mapRes[k] = v instanceof Y.AbstractType ? v.toJSON() : v\n }\n t.compare(userMapValues[0], mapRes)\n // Compare all users\n for (let i = 0; i < users.length - 1; i++) {\n t.compare(userArrayValues[i].length, users[i].getArray('array').length)\n t.compare(userArrayValues[i], userArrayValues[i + 1])\n t.compare(userMapValues[i], userMapValues[i + 1])\n t.compare(userXmlValues[i], userXmlValues[i + 1])\n t.compare(userTextValues[i].map(/** @param {any} a */ a => typeof a.insert === 'string' ? a.insert : ' ').join('').length, users[i].getText('text').length)\n t.compare(userTextValues[i], userTextValues[i + 1], '', (_constructor, a, b) => {\n if (a instanceof Y.AbstractType) {\n t.compare(a.toJSON(), b.toJSON())\n } else if (a !== b) {\n t.fail('Deltas dont match')\n }\n return true\n })\n t.compare(Y.encodeStateVector(users[i]), Y.encodeStateVector(users[i + 1]))\n compareDS(Y.createDeleteSetFromStructStore(users[i].store), Y.createDeleteSetFromStructStore(users[i + 1].store))\n compareStructStores(users[i].store, users[i + 1].store)\n }\n users.map(u => u.destroy())\n}\n\n/**\n * @param {Y.Item?} a\n * @param {Y.Item?} b\n * @return {boolean}\n */\nexport const compareItemIDs = (a, b) => a === b || (a !== null && b != null && Y.compareIDs(a.id, b.id))\n\n/**\n * @param {import('../src/internals.js').StructStore} ss1\n * @param {import('../src/internals.js').StructStore} ss2\n */\nexport const compareStructStores = (ss1, ss2) => {\n t.assert(ss1.clients.size === ss2.clients.size)\n for (const [client, structs1] of ss1.clients) {\n const structs2 = /** @type {Array<Y.AbstractStruct>} */ (ss2.clients.get(client))\n t.assert(structs2 !== undefined && structs1.length === structs2.length)\n for (let i = 0; i < structs1.length; i++) {\n const s1 = structs1[i]\n const s2 = structs2[i]\n // checks for abstract struct\n if (\n s1.constructor !== s2.constructor ||\n !Y.compareIDs(s1.id, s2.id) ||\n s1.deleted !== s2.deleted ||\n // @ts-ignore\n s1.length !== s2.length\n ) {\n t.fail('Structs dont match')\n }\n if (s1 instanceof Y.Item) {\n if (\n !(s2 instanceof Y.Item) ||\n !((s1.left === null && s2.left === null) || (s1.left !== null && s2.left !== null && Y.compareIDs(s1.left.lastId, s2.left.lastId))) ||\n !compareItemIDs(s1.right, s2.right) ||\n !Y.compareIDs(s1.origin, s2.origin) ||\n !Y.compareIDs(s1.rightOrigin, s2.rightOrigin) ||\n s1.parentSub !== s2.parentSub\n ) {\n return t.fail('Items dont match')\n }\n // make sure that items are connected correctly\n t.assert(s1.left === null || s1.left.right === s1)\n t.assert(s1.right === null || s1.right.left === s1)\n t.assert(s2.left === null || s2.left.right === s2)\n t.assert(s2.right === null || s2.right.left === s2)\n }\n }\n }\n}\n\n/**\n * @param {import('../src/internals.js').DeleteSet} ds1\n * @param {import('../src/internals.js').DeleteSet} ds2\n */\nexport const compareDS = (ds1, ds2) => {\n t.assert(ds1.clients.size === ds2.clients.size)\n ds1.clients.forEach((deleteItems1, client) => {\n const deleteItems2 = /** @type {Array<import('../src/internals.js').DeleteItem>} */ (ds2.clients.get(client))\n t.assert(deleteItems2 !== undefined && deleteItems1.length === deleteItems2.length)\n for (let i = 0; i < deleteItems1.length; i++) {\n const di1 = deleteItems1[i]\n const di2 = deleteItems2[i]\n if (di1.clock !== di2.clock || di1.len !== di2.len) {\n t.fail('DeleteSets dont match')\n }\n }\n })\n}\n\n/**\n * @template T\n * @callback InitTestObjectCallback\n * @param {TestYInstance} y\n * @return {T}\n */\n\n/**\n * @template T\n * @param {t.TestCase} tc\n * @param {Array<function(Y.Doc,prng.PRNG,T):void>} mods\n * @param {number} iterations\n * @param {InitTestObjectCallback<T>} [initTestObject]\n */\nexport const applyRandomTests = (tc, mods, iterations, initTestObject) => {\n const gen = tc.prng\n const result = init(tc, { users: 5 }, initTestObject)\n const { testConnector, users } = result\n for (let i = 0; i < iterations; i++) {\n if (prng.int32(gen, 0, 100) <= 2) {\n // 2% chance to disconnect/reconnect a random user\n if (prng.bool(gen)) {\n testConnector.disconnectRandom()\n } else {\n testConnector.reconnectRandom()\n }\n } else if (prng.int32(gen, 0, 100) <= 1) {\n // 1% chance to flush all\n testConnector.flushAllMessages()\n } else if (prng.int32(gen, 0, 100) <= 50) {\n // 50% chance to flush a random message\n testConnector.flushRandomMessage()\n }\n const user = prng.int32(gen, 0, users.length - 1)\n const test = prng.oneOf(gen, mods)\n test(users[user], gen, result.testObjects[user])\n }\n compare(users)\n return result\n}\n"],"names":[],"mappings":"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"}