test with v1 and v2 encoding
This commit is contained in:
parent
ba83398374
commit
47221c26c4
@ -75,5 +75,6 @@ export {
|
|||||||
transact,
|
transact,
|
||||||
AbstractConnector,
|
AbstractConnector,
|
||||||
logType,
|
logType,
|
||||||
mergeUpdates
|
mergeUpdates,
|
||||||
|
mergeUpdatesV2
|
||||||
} from './internals.js'
|
} from './internals.js'
|
||||||
|
@ -173,7 +173,7 @@ const sliceStruct = (left, diff) => {
|
|||||||
* @return {Uint8Array}
|
* @return {Uint8Array}
|
||||||
*/
|
*/
|
||||||
export const mergeUpdatesV2 = (updates, YDecoder = UpdateDecoderV2, YEncoder = UpdateEncoderV2) => {
|
export const mergeUpdatesV2 = (updates, YDecoder = UpdateDecoderV2, YEncoder = UpdateEncoderV2) => {
|
||||||
const updateDecoders = updates.map(update => new UpdateDecoderV1(decoding.createDecoder(update)))
|
const updateDecoders = updates.map(update => new YDecoder(decoding.createDecoder(update)))
|
||||||
let lazyStructDecoders = updateDecoders.map(decoder => new LazyStructReader(decoder))
|
let lazyStructDecoders = updateDecoders.map(decoder => new LazyStructReader(decoder))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2,15 +2,23 @@ import * as t from 'lib0/testing.js'
|
|||||||
import { init, compare } from './testHelper.js' // eslint-disable-line
|
import { init, compare } from './testHelper.js' // eslint-disable-line
|
||||||
import * as Y from '../src/index.js'
|
import * as Y from '../src/index.js'
|
||||||
|
|
||||||
|
const useV2 = true
|
||||||
|
|
||||||
|
const encodeStateAsUpdate = useV2 ? Y.encodeStateAsUpdateV2 : Y.encodeStateAsUpdate
|
||||||
|
const mergeUpdates = useV2 ? Y.mergeUpdatesV2 : Y.mergeUpdates
|
||||||
|
const applyUpdate = useV2 ? Y.applyUpdateV2 : Y.applyUpdate
|
||||||
|
const logUpdate = useV2 ? Y.logUpdateV2 : Y.logUpdate
|
||||||
|
const updateEventName = useV2 ? 'updateV2' : 'update'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Array<Y.Doc>} users
|
* @param {Array<Y.Doc>} users
|
||||||
*/
|
*/
|
||||||
const fromUpdates = users => {
|
const fromUpdates = users => {
|
||||||
const updates = users.map(user =>
|
const updates = users.map(user =>
|
||||||
Y.encodeStateAsUpdate(user)
|
encodeStateAsUpdate(user)
|
||||||
)
|
)
|
||||||
const ydoc = new Y.Doc()
|
const ydoc = new Y.Doc()
|
||||||
Y.applyUpdate(ydoc, Y.mergeUpdates(updates))
|
applyUpdate(ydoc, mergeUpdates(updates))
|
||||||
return ydoc
|
return ydoc
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -34,7 +42,7 @@ export const testMergeUpdates = tc => {
|
|||||||
export const testMergeUpdatesWrongOrder = tc => {
|
export const testMergeUpdatesWrongOrder = tc => {
|
||||||
const ydoc = new Y.Doc()
|
const ydoc = new Y.Doc()
|
||||||
const updates = /** @type {Array<Uint8Array>} */ ([])
|
const updates = /** @type {Array<Uint8Array>} */ ([])
|
||||||
ydoc.on('update', update => { updates.push(update) })
|
ydoc.on(updateEventName, update => { updates.push(update) })
|
||||||
|
|
||||||
const array = ydoc.getArray()
|
const array = ydoc.getArray()
|
||||||
array.insert(0, [1])
|
array.insert(0, [1])
|
||||||
@ -42,31 +50,42 @@ export const testMergeUpdatesWrongOrder = tc => {
|
|||||||
array.insert(0, [3])
|
array.insert(0, [3])
|
||||||
array.insert(0, [4])
|
array.insert(0, [4])
|
||||||
|
|
||||||
const wrongOrder = Y.mergeUpdates([
|
const cases = []
|
||||||
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]])
|
|
||||||
])
|
|
||||||
|
|
||||||
const targetState = Y.encodeStateAsUpdate(ydoc)
|
// Case 1: Simple case, simply merge everything
|
||||||
|
cases.push(mergeUpdates(updates))
|
||||||
|
|
||||||
|
// Case 2: Overlapping updates
|
||||||
|
cases.push(mergeUpdates([
|
||||||
|
mergeUpdates(updates.slice(2)),
|
||||||
|
mergeUpdates(updates.slice(0, 2))
|
||||||
|
]))
|
||||||
|
|
||||||
|
// Case 3: Overlapping updates
|
||||||
|
cases.push(mergeUpdates([
|
||||||
|
mergeUpdates(updates.slice(2)),
|
||||||
|
mergeUpdates(updates.slice(1, 3)),
|
||||||
|
updates[0]
|
||||||
|
]))
|
||||||
|
|
||||||
|
// Case 4: Separated updates (containing skips)
|
||||||
|
cases.push(mergeUpdates([
|
||||||
|
mergeUpdates([updates[0], updates[2]]),
|
||||||
|
mergeUpdates([updates[1], updates[3]])
|
||||||
|
]))
|
||||||
|
|
||||||
|
// Case 5: overlapping with many duplicates
|
||||||
|
cases.push(mergeUpdates(cases))
|
||||||
|
|
||||||
|
const targetState = encodeStateAsUpdate(ydoc)
|
||||||
t.info('Target State: ')
|
t.info('Target State: ')
|
||||||
Y.logUpdate(targetState)
|
logUpdate(targetState)
|
||||||
const allcases = [wrongOrder, overlapping, separated]
|
|
||||||
// case 4: merging all cases above
|
cases.forEach((updates, i) => {
|
||||||
allcases.push(Y.mergeUpdates(allcases))
|
t.info('State Case $' + i + ':')
|
||||||
allcases.forEach((updates, i) => {
|
logUpdate(updates)
|
||||||
t.info('State $' + i + ':')
|
|
||||||
Y.logUpdate(updates)
|
|
||||||
const merged = new Y.Doc()
|
const merged = new Y.Doc()
|
||||||
Y.applyUpdate(merged, updates)
|
applyUpdate(merged, updates)
|
||||||
t.compareArrays(merged.getArray().toArray(), array.toArray())
|
t.compareArrays(merged.getArray().toArray(), array.toArray())
|
||||||
t.compare(updates, targetState)
|
t.compare(updates, targetState)
|
||||||
})
|
})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user