add merge tests for #263
This commit is contained in:
parent
972d15dda5
commit
7a45be8c88
@ -72,5 +72,6 @@ export {
|
|||||||
tryGc,
|
tryGc,
|
||||||
transact,
|
transact,
|
||||||
AbstractConnector,
|
AbstractConnector,
|
||||||
logType
|
logType,
|
||||||
|
mergeUpdates
|
||||||
} from './internals.js'
|
} from './internals.js'
|
||||||
|
@ -15,6 +15,7 @@ export * from './utils/Snapshot.js'
|
|||||||
export * from './utils/StructStore.js'
|
export * from './utils/StructStore.js'
|
||||||
export * from './utils/Transaction.js'
|
export * from './utils/Transaction.js'
|
||||||
export * from './utils/UndoManager.js'
|
export * from './utils/UndoManager.js'
|
||||||
|
export * from './utils/updates.js'
|
||||||
export * from './utils/YEvent.js'
|
export * from './utils/YEvent.js'
|
||||||
|
|
||||||
export * from './types/AbstractType.js'
|
export * from './types/AbstractType.js'
|
||||||
|
16
src/utils/updates.js
Normal file
16
src/utils/updates.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Array<Uint8Array>} updates
|
||||||
|
* @return {Uint8Array}
|
||||||
|
*/
|
||||||
|
export const mergeUpdates = updates => {
|
||||||
|
return updates[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Uint8Array} update
|
||||||
|
* @param {Uint8Array} sv
|
||||||
|
*/
|
||||||
|
export const diffUpdate = (update, sv) => {
|
||||||
|
return update
|
||||||
|
}
|
@ -8,6 +8,7 @@ import * as undoredo from './undo-redo.tests.js'
|
|||||||
import * as compatibility from './compatibility.tests.js'
|
import * as compatibility from './compatibility.tests.js'
|
||||||
import * as doc from './doc.tests.js'
|
import * as doc from './doc.tests.js'
|
||||||
import * as snapshot from './snapshot.tests.js'
|
import * as snapshot from './snapshot.tests.js'
|
||||||
|
import * as updates from './updates.tests.js'
|
||||||
|
|
||||||
import { runTests } from 'lib0/testing.js'
|
import { runTests } from 'lib0/testing.js'
|
||||||
import { isBrowser, isNode } from 'lib0/environment.js'
|
import { isBrowser, isNode } from 'lib0/environment.js'
|
||||||
@ -17,7 +18,7 @@ if (isBrowser) {
|
|||||||
log.createVConsole(document.body)
|
log.createVConsole(document.body)
|
||||||
}
|
}
|
||||||
runTests({
|
runTests({
|
||||||
doc, map, array, text, xml, encoding, undoredo, compatibility, snapshot
|
doc, map, array, text, xml, encoding, undoredo, compatibility, snapshot, updates
|
||||||
}).then(success => {
|
}).then(success => {
|
||||||
/* istanbul ignore next */
|
/* istanbul ignore next */
|
||||||
if (isNode) {
|
if (isNode) {
|
||||||
|
64
tests/updates.tests.js
Normal file
64
tests/updates.tests.js
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
import * as t from 'lib0/testing.js'
|
||||||
|
import { init, compare } from './testHelper.js' // eslint-disable-line
|
||||||
|
import * as Y from '../src/index.js'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Array<Y.Doc>} users
|
||||||
|
*/
|
||||||
|
const fromUpdates = users => {
|
||||||
|
const updates = users.map(user =>
|
||||||
|
Y.encodeStateAsUpdate(user)
|
||||||
|
)
|
||||||
|
const ydoc = new Y.Doc()
|
||||||
|
Y.applyUpdate(ydoc, Y.mergeUpdates(updates))
|
||||||
|
return ydoc
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {t.TestCase} tc
|
||||||
|
*/
|
||||||
|
export const testMergeUpdates = tc => {
|
||||||
|
const { users, array0, array1 } = init(tc, { users: 3 })
|
||||||
|
|
||||||
|
array0.insert(0, [1])
|
||||||
|
array1.insert(0, [2])
|
||||||
|
|
||||||
|
const merged = fromUpdates(users)
|
||||||
|
compare(users)
|
||||||
|
t.compareArrays(array0.toArray(), merged.getArray('array').toArray())
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {t.TestCase} tc
|
||||||
|
*/
|
||||||
|
export const testMergeUpdatesWrongOrder = tc => {
|
||||||
|
const ydoc = new Y.Doc()
|
||||||
|
const updates = /** @type {Array<Uint8Array>} */ ([])
|
||||||
|
ydoc.on('update', update => { updates.push(update) })
|
||||||
|
|
||||||
|
const array = ydoc.getArray()
|
||||||
|
array.insert(0, [1])
|
||||||
|
array.insert(0, [2])
|
||||||
|
array.insert(0, [3])
|
||||||
|
array.insert(0, [4])
|
||||||
|
|
||||||
|
const wrongOrder = Y.mergeUpdates([
|
||||||
|
Y.mergeUpdates(updates.slice(2)),
|
||||||
|
Y.mergeUpdates(updates.slice(0, 2))
|
||||||
|
])
|
||||||
|
const overlapping = Y.mergeUpdates([
|
||||||
|
Y.mergeUpdates(updates.slice(2)),
|
||||||
|
Y.mergeUpdates(updates.slice(1, 3)),
|
||||||
|
updates[0]
|
||||||
|
])
|
||||||
|
const separated = Y.mergeUpdates([
|
||||||
|
Y.mergeUpdates([updates[0], updates[2]]),
|
||||||
|
Y.mergeUpdates([updates[1], updates[3]])
|
||||||
|
])
|
||||||
|
|
||||||
|
;[wrongOrder, overlapping, separated].forEach(updates => {
|
||||||
|
const merged = new Y.Doc()
|
||||||
|
Y.applyUpdate(merged, updates)
|
||||||
|
t.compareArrays(merged.getArray().toArray(), array.toArray())
|
||||||
|
})
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user