node-inspector
This commit is contained in:
parent
b9e21665e2
commit
4bfe484fc2
@ -128,8 +128,8 @@ gulp.task('build_jasmine_browser', function () {
|
||||
loose: 'all',
|
||||
modules: 'ignore',
|
||||
// optional: ['es7.asyncFunctions'],
|
||||
blacklist: "regenerator",
|
||||
//experimental: true
|
||||
blacklist: 'regenerator'
|
||||
// experimental: true
|
||||
}))
|
||||
.pipe(sourcemaps.write())
|
||||
.pipe(gulp.dest('build'))
|
||||
|
16
spec/support/jasmine.json
Normal file
16
spec/support/jasmine.json
Normal file
@ -0,0 +1,16 @@
|
||||
{
|
||||
"spec_dir": "src",
|
||||
"spec_files": [
|
||||
"**/**.spec.js"
|
||||
],
|
||||
"helpers": [
|
||||
"Helper.spec.js",
|
||||
"y.js",
|
||||
"Connector.js",
|
||||
"OperationStore.js",
|
||||
"Struct.js",
|
||||
"Utils.js",
|
||||
"OperationStores/RedBlackTree.js",
|
||||
"OperationStores/Memory.js"
|
||||
]
|
||||
}
|
@ -1,3 +1,5 @@
|
||||
'use strict'
|
||||
|
||||
class AbstractConnector { // eslint-disable-line no-unused-vars
|
||||
/*
|
||||
opts
|
||||
@ -125,7 +127,6 @@ class AbstractConnector { // eslint-disable-line no-unused-vars
|
||||
if (this.debug) {
|
||||
console.log(`me -> ${uid}: ${message.type}`, m);// eslint-disable-line
|
||||
}
|
||||
super(uid, message)
|
||||
}
|
||||
// You received a raw message, and you know that it is intended for to Yjs. Then call this function.
|
||||
receiveMessage (sender, m) {
|
||||
|
@ -1,4 +1,5 @@
|
||||
/* global getRandom, AbstractConnector, Y, wait */
|
||||
'use strict'
|
||||
|
||||
var globalRoom = {
|
||||
users: {},
|
||||
@ -66,11 +67,11 @@ class Test extends AbstractConnector {
|
||||
}
|
||||
reconnect () {
|
||||
globalRoom.addUser(this)
|
||||
super()
|
||||
super.reconnect()
|
||||
}
|
||||
disconnect () {
|
||||
globalRoom.removeUser(this.userId)
|
||||
super()
|
||||
super.disconnect()
|
||||
}
|
||||
flush () {
|
||||
var buff = globalRoom.buffers[this.userId]
|
||||
|
@ -5,13 +5,23 @@
|
||||
This is just a compilation of functions that help to test this library!
|
||||
***/
|
||||
|
||||
function wait(t = 10) {//eslint-disable-line
|
||||
var g = global || window
|
||||
g.g = g
|
||||
|
||||
var co = require('co')
|
||||
g.co = co
|
||||
|
||||
function wait (t) {
|
||||
if (t == null) {
|
||||
t = 10
|
||||
}
|
||||
var def = Promise.defer()
|
||||
setTimeout(function () {
|
||||
def.resolve()
|
||||
}, t)
|
||||
return def.promise
|
||||
}
|
||||
g.wait = wait
|
||||
|
||||
// returns a random element of o
|
||||
// works on Object, and Array
|
||||
@ -26,14 +36,17 @@ function getRandom (o) {
|
||||
return o[getRandom(ks)]
|
||||
}
|
||||
}
|
||||
g.getRandom = getRandom
|
||||
|
||||
function getRandomNumber(n) {//eslint-disable-line
|
||||
if (n == null) {
|
||||
n = 9999
|
||||
}
|
||||
return Math.floor(Math.random() * n)
|
||||
}
|
||||
g.getRandomNumber = getRandomNumber
|
||||
|
||||
async function applyRandomTransactions (users, objects, transactions, numberOfTransactions) {//eslint-disable-line
|
||||
g.applyRandomTransactions = co.wrap(function * applyRandomTransactions (users, objects, transactions, numberOfTransactions) { //eslint-disable-line
|
||||
function randomTransaction (root) {
|
||||
var f = getRandom(transactions)
|
||||
f(root)
|
||||
@ -51,24 +64,24 @@ async function applyRandomTransactions (users, objects, transactions, numberOfTr
|
||||
}
|
||||
}
|
||||
applyTransactions()
|
||||
await users[0].connector.flushAll()
|
||||
yield users[0].connector.flushAll()
|
||||
users[0].disconnect()
|
||||
await wait()
|
||||
yield wait()
|
||||
applyTransactions()
|
||||
await users[0].connector.flushAll()
|
||||
yield users[0].connector.flushAll()
|
||||
users[0].reconnect()
|
||||
await wait()
|
||||
await users[0].connector.flushAll()
|
||||
}
|
||||
yield wait()
|
||||
yield users[0].connector.flushAll()
|
||||
})
|
||||
|
||||
async function garbageCollectAllUsers (users) {
|
||||
g.garbageCollectAllUsers = co.wrap(function * garbageCollectAllUsers (users) {
|
||||
for (var i in users) {
|
||||
await users[i].db.garbageCollect()
|
||||
await users[i].db.garbageCollect()
|
||||
yield users[i].db.garbageCollect()
|
||||
yield users[i].db.garbageCollect()
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
async function compareAllUsers(users){//eslint-disable-line
|
||||
g.compareAllUsers = co.wrap(function * compareAllUsers (users) { //eslint-disable-line
|
||||
var s1, s2, ds1, ds2, allDels1, allDels2
|
||||
var db1 = []
|
||||
function * t1 () {
|
||||
@ -87,11 +100,11 @@ async function compareAllUsers(users){//eslint-disable-line
|
||||
allDels2.push(d)
|
||||
})
|
||||
}
|
||||
await users[0].connector.flushAll()
|
||||
await garbageCollectAllUsers(users)
|
||||
await wait(200)
|
||||
await garbageCollectAllUsers(users)
|
||||
await wait(200)
|
||||
yield users[0].connector.flushAll()
|
||||
yield g.garbageCollectAllUsers(users)
|
||||
yield wait(200)
|
||||
yield g.garbageCollectAllUsers(users)
|
||||
yield wait(200)
|
||||
for (var uid = 0; uid < users.length; uid++) {
|
||||
var u = users[uid]
|
||||
// compare deleted ops against deleteStore
|
||||
@ -116,16 +129,16 @@ async function compareAllUsers(users){//eslint-disable-line
|
||||
}
|
||||
})
|
||||
// compare allDels tree
|
||||
await wait()
|
||||
yield wait()
|
||||
if (s1 == null) {
|
||||
u.db.requestTransaction(t1)
|
||||
await wait()
|
||||
yield wait()
|
||||
u.db.os.iterate(null, null, function(o){//eslint-disable-line
|
||||
db1.push(o)
|
||||
})
|
||||
} else {
|
||||
u.db.requestTransaction(t2)
|
||||
await wait()
|
||||
yield wait()
|
||||
expect(s1).toEqual(s2)
|
||||
expect(allDels1).toEqual(allDels2) // inner structure
|
||||
expect(ds1).toEqual(ds2) // exported structure
|
||||
@ -135,11 +148,11 @@ async function compareAllUsers(users){//eslint-disable-line
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
async function createUsers(self, numberOfUsers) {//eslint-disable-line
|
||||
g.createUsers = co.wrap(function * createUsers (self, numberOfUsers) { //eslint-disable-line
|
||||
if (globalRoom.users[0] != null) {//eslint-disable-line
|
||||
await globalRoom.users[0].flushAll()//eslint-disable-line
|
||||
yield globalRoom.users[0].flushAll()//eslint-disable-line
|
||||
}
|
||||
// destroy old users
|
||||
for (var u in globalRoom.users) {//eslint-disable-line
|
||||
@ -160,5 +173,5 @@ async function createUsers(self, numberOfUsers) {//eslint-disable-line
|
||||
}
|
||||
}))
|
||||
}
|
||||
self.users = await Promise.all(promises)
|
||||
}
|
||||
self.users = yield Promise.all(promises)
|
||||
})
|
||||
|
@ -1,4 +1,10 @@
|
||||
/* global Y, copyObject, Struct, RBTree */
|
||||
/* global Y */
|
||||
|
||||
'use strict'
|
||||
|
||||
var RBTree = Y.RBTree
|
||||
var Struct = Y.Struct
|
||||
var copyObject = Y.copyObject
|
||||
|
||||
class AbstractTransaction { // eslint-disable-line no-unused-vars
|
||||
constructor (store) {
|
||||
@ -37,6 +43,7 @@ class AbstractTransaction { // eslint-disable-line no-unused-vars
|
||||
}
|
||||
}
|
||||
}
|
||||
Y.AbstractTransaction = AbstractTransaction
|
||||
|
||||
class AbstractOperationStore { // eslint-disable-line no-unused-vars
|
||||
constructor (y, opts) {
|
||||
@ -216,7 +223,7 @@ class AbstractOperationStore { // eslint-disable-line no-unused-vars
|
||||
yield* this.store.operationAdded(this, op)
|
||||
|
||||
if (isDeleted) {
|
||||
yield* Struct["Delete"].execute.call(this, {target: op.id})
|
||||
yield* Struct['Delete'].execute.call(this, {target: op.id})
|
||||
}
|
||||
|
||||
// find next operation to execute
|
||||
@ -272,3 +279,4 @@ class AbstractOperationStore { // eslint-disable-line no-unused-vars
|
||||
ls.push(f)
|
||||
}
|
||||
}
|
||||
Y.AbstractOperationStore = AbstractOperationStore
|
||||
|
@ -1,4 +1,5 @@
|
||||
/* global Struct, RBTree, Y, compareIds */
|
||||
'use strict'
|
||||
|
||||
function copyObject (o) {
|
||||
var c = {}
|
||||
@ -8,7 +9,7 @@ function copyObject (o) {
|
||||
return c
|
||||
}
|
||||
|
||||
class DeleteStore extends RBTree { // eslint-disable-line
|
||||
class DeleteStore extends Y.RBTree {
|
||||
constructor () {
|
||||
super()
|
||||
}
|
||||
@ -116,8 +117,10 @@ class DeleteStore extends RBTree { // eslint-disable-line
|
||||
}
|
||||
}
|
||||
|
||||
Y.DeleteStore = DeleteStore
|
||||
|
||||
Y.Memory = (function () { // eslint-disable-line no-unused-vars
|
||||
class Transaction extends AbstractTransaction { // eslint-disable-line
|
||||
class Transaction extends Y.AbstractTransaction { // eslint-disable-line
|
||||
|
||||
constructor (store) {
|
||||
super(store)
|
||||
@ -130,7 +133,7 @@ Y.Memory = (function () { // eslint-disable-line no-unused-vars
|
||||
if (n !== null && n.val.id[0] === state.user) {
|
||||
state.clock = Math.max(state.clock, n.val.id[1] + n.val.len)
|
||||
}
|
||||
}
|
||||
}
|
||||
* getDeleteSet (id) {
|
||||
return this.ds.toDeleteSet(id)
|
||||
}
|
||||
@ -245,7 +248,7 @@ Y.Memory = (function () { // eslint-disable-line no-unused-vars
|
||||
return op
|
||||
}
|
||||
}
|
||||
class OperationStore extends AbstractOperationStore { // eslint-disable-line no-undef
|
||||
class OperationStore extends Y.AbstractOperationStore { // eslint-disable-line no-undef
|
||||
constructor (y, opts) {
|
||||
super(y, opts)
|
||||
this.os = new RBTree()
|
||||
@ -257,10 +260,11 @@ Y.Memory = (function () { // eslint-disable-line no-unused-vars
|
||||
logTable () {
|
||||
this.os.logTable()
|
||||
}
|
||||
requestTransaction (_makeGen, requestNow = false) {
|
||||
requestTransaction (_makeGen, requestNow) {
|
||||
if (requestNow == null) { requestNow = false }
|
||||
if (!this.transactionInProgress) {
|
||||
this.transactionInProgress = true
|
||||
var transact = () => {
|
||||
var transact = (xxxx) => {
|
||||
var makeGen = _makeGen
|
||||
while (makeGen != null) {
|
||||
var t = new Transaction(this)
|
||||
|
@ -1,6 +1,8 @@
|
||||
/* global DeleteStore */
|
||||
/* global Y */
|
||||
/* eslint-env browser,jasmine,console */
|
||||
|
||||
var DeleteStore = Y.DeleteStore
|
||||
|
||||
describe('Memory', function () {
|
||||
describe('DeleteStore', function () {
|
||||
var ds
|
||||
|
@ -1,4 +1,8 @@
|
||||
/* global compareIds, copyObject */
|
||||
/* global Y, copyObject */
|
||||
'use strict'
|
||||
|
||||
var compareIds = Y.compareIds
|
||||
|
||||
function smaller (a, b) {
|
||||
return a[0] < b[0] || (a[0] === b[0] && a[1] < b[1])
|
||||
}
|
||||
@ -26,8 +30,8 @@ class N {
|
||||
return this._parent
|
||||
}
|
||||
get sibling () {
|
||||
return (this === this.parent.left) ?
|
||||
this.parent.right : this.parent.left
|
||||
return (this === this.parent.left)
|
||||
? this.parent.right : this.parent.left
|
||||
}
|
||||
get left () {
|
||||
return this._left
|
||||
@ -192,7 +196,9 @@ class RBTree { // eslint-disable-line no-unused-vars
|
||||
}
|
||||
return true
|
||||
}
|
||||
logTable (from = null, to = null) {
|
||||
logTable (from, to) {
|
||||
if (from == null) { from = null }
|
||||
if (to == null) { to = null }
|
||||
var os = []
|
||||
this.iterate(from, to, function (o) {
|
||||
var o_ = copyObject(o)
|
||||
@ -453,3 +459,5 @@ class RBTree { // eslint-disable-line no-unused-vars
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Y.RBTree = RBTree
|
||||
|
@ -1,6 +1,9 @@
|
||||
/* global RBTree, smaller, compareIds */
|
||||
/* global Y */
|
||||
/* eslint-env browser,jasmine,console */
|
||||
|
||||
var RBTree = Y.RBTree
|
||||
var compareIds = Y.compareIds
|
||||
var smaller = Y.smaller
|
||||
var numberOfRBTreeTests = 1000
|
||||
|
||||
function itRedNodesDoNotHaveBlackChildren (tree) {
|
||||
|
@ -1,4 +1,7 @@
|
||||
/* global copyObject, Y*/
|
||||
/* global Y */
|
||||
'use strict'
|
||||
|
||||
var copyObject = Y.copyObject
|
||||
|
||||
function compareIds (id1, id2) {
|
||||
if (id1 == null || id2 == null) {
|
||||
@ -13,6 +16,7 @@ function compareIds (id1, id2) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
Y.compareIds = compareIds
|
||||
|
||||
var Struct = {
|
||||
/* This Operations does _not_ have an id!
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* global createUsers, wait, Y, compareAllUsers, getRandomNumber, applyRandomTransactions */
|
||||
/* global createUsers, wait, Y, compareAllUsers, getRandomNumber, applyRandomTransactions, co, garbageCollectAllUsers */
|
||||
/* eslint-env browser,jasmine */
|
||||
|
||||
var numberOfYArrayTests = 5
|
||||
@ -7,160 +7,160 @@ describe('Array Type', function () {
|
||||
var y1, y2, y3, yconfig1, yconfig2, yconfig3, flushAll
|
||||
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000
|
||||
beforeEach(async function (done) {
|
||||
await createUsers(this, 3)
|
||||
beforeEach(co.wrap(function * (done) {
|
||||
yield createUsers(this, 3)
|
||||
y1 = (yconfig1 = this.users[0]).root
|
||||
y2 = (yconfig2 = this.users[1]).root
|
||||
y3 = (yconfig3 = this.users[2]).root
|
||||
flushAll = this.users[0].connector.flushAll
|
||||
done()
|
||||
})
|
||||
afterEach(async function(done) {
|
||||
await compareAllUsers(this.users)
|
||||
}))
|
||||
afterEach(co.wrap(function * (done) {
|
||||
yield compareAllUsers(this.users)
|
||||
done()
|
||||
})
|
||||
}))
|
||||
|
||||
describe('Basic tests', function () {
|
||||
it('insert three elements, try re-get property', async function (done) {
|
||||
var array = await y1.set('Array', Y.Array)
|
||||
it('insert three elements, try re-get property', co.wrap(function * (done) {
|
||||
var array = yield y1.set('Array', Y.Array)
|
||||
array.insert(0, [1, 2, 3])
|
||||
array = await y1.get('Array') // re-get property
|
||||
array = yield y1.get('Array') // re-get property
|
||||
expect(array.toArray()).toEqual([1, 2, 3])
|
||||
done()
|
||||
})
|
||||
it('Basic insert in array (handle three conflicts)', async function (done) {
|
||||
await y1.set('Array', Y.Array)
|
||||
await flushAll()
|
||||
var l1 = await y1.get('Array')
|
||||
}))
|
||||
it('Basic insert in array (handle three conflicts)', co.wrap(function * (done) {
|
||||
yield y1.set('Array', Y.Array)
|
||||
yield flushAll()
|
||||
var l1 = yield y1.get('Array')
|
||||
l1.insert(0, [0])
|
||||
var l2 = await y2.get('Array')
|
||||
var l2 = yield y2.get('Array')
|
||||
l2.insert(0, [1])
|
||||
var l3 = await y3.get('Array')
|
||||
var l3 = yield y3.get('Array')
|
||||
l3.insert(0, [2])
|
||||
await flushAll()
|
||||
yield flushAll()
|
||||
expect(l1.toArray()).toEqual(l2.toArray())
|
||||
expect(l2.toArray()).toEqual(l3.toArray())
|
||||
done()
|
||||
})
|
||||
it('Basic insert&delete in array (handle three conflicts)', async function (done) {
|
||||
}))
|
||||
it('Basic insert&delete in array (handle three conflicts)', co.wrap(function * (done) {
|
||||
var l1, l2, l3
|
||||
l1 = await y1.set('Array', Y.Array)
|
||||
l1 = yield y1.set('Array', Y.Array)
|
||||
l1.insert(0, ['x', 'y', 'z'])
|
||||
await flushAll()
|
||||
yield flushAll()
|
||||
l1.insert(1, [0])
|
||||
l2 = await y2.get('Array')
|
||||
l2 = yield y2.get('Array')
|
||||
l2.delete(0)
|
||||
l2.delete(1)
|
||||
l3 = await y3.get('Array')
|
||||
l3 = yield y3.get('Array')
|
||||
l3.insert(1, [2])
|
||||
await flushAll()
|
||||
yield flushAll()
|
||||
expect(l1.toArray()).toEqual(l2.toArray())
|
||||
expect(l2.toArray()).toEqual(l3.toArray())
|
||||
expect(l2.toArray()).toEqual([0, 2, 'y'])
|
||||
done()
|
||||
})
|
||||
it('Handles getOperations ascending ids bug in late sync', async function (done) {
|
||||
}))
|
||||
it('Handles getOperations ascending ids bug in late sync', co.wrap(function * (done) {
|
||||
var l1, l2
|
||||
l1 = await y1.set('Array', Y.Array)
|
||||
l1 = yield y1.set('Array', Y.Array)
|
||||
l1.insert(0, ['x', 'y'])
|
||||
await flushAll()
|
||||
yield flushAll()
|
||||
yconfig3.disconnect()
|
||||
yconfig2.disconnect()
|
||||
await wait()
|
||||
l2 = await y2.get('Array')
|
||||
yield wait()
|
||||
l2 = yield y2.get('Array')
|
||||
l2.insert(1, [2])
|
||||
l2.insert(1, [3])
|
||||
await flushAll()
|
||||
yield flushAll()
|
||||
yconfig2.reconnect()
|
||||
yconfig3.reconnect()
|
||||
await wait()
|
||||
await flushAll()
|
||||
yield wait()
|
||||
yield flushAll()
|
||||
expect(l1.toArray()).toEqual(l2.toArray())
|
||||
done()
|
||||
})
|
||||
it('Handles deletions in late sync', async function (done) {
|
||||
}))
|
||||
it('Handles deletions in late sync', co.wrap(function * (done) {
|
||||
var l1, l2
|
||||
l1 = await y1.set('Array', Y.Array)
|
||||
l1 = yield y1.set('Array', Y.Array)
|
||||
l1.insert(0, ['x', 'y'])
|
||||
await flushAll()
|
||||
yield flushAll()
|
||||
yconfig2.disconnect()
|
||||
await wait()
|
||||
l2 = await y2.get('Array')
|
||||
yield wait()
|
||||
l2 = yield y2.get('Array')
|
||||
l2.delete(1, 1)
|
||||
l1.delete(0, 2)
|
||||
await flushAll()
|
||||
yield flushAll()
|
||||
yconfig2.reconnect()
|
||||
await wait()
|
||||
await flushAll()
|
||||
yield wait()
|
||||
yield flushAll()
|
||||
expect(l1.toArray()).toEqual(l2.toArray())
|
||||
done()
|
||||
})
|
||||
it('Handles deletions in late sync (2)', async function (done) {
|
||||
}))
|
||||
it('Handles deletions in late sync (2)', co.wrap(function * (done) {
|
||||
var l1, l2
|
||||
l1 = await y1.set('Array', Y.Array)
|
||||
await flushAll()
|
||||
l2 = await y2.get('Array')
|
||||
l1 = yield y1.set('Array', Y.Array)
|
||||
yield flushAll()
|
||||
l2 = yield y2.get('Array')
|
||||
l1.insert(0, ['x', 'y'])
|
||||
l1.delete(0, 2)
|
||||
await wait(500)
|
||||
await flushAll()
|
||||
await wait(500)
|
||||
yield wait(500)
|
||||
yield flushAll()
|
||||
yield wait(500)
|
||||
expect(l1.toArray()).toEqual(l2.toArray())
|
||||
await compareAllUsers(this.users)
|
||||
yield compareAllUsers(this.users)
|
||||
done()
|
||||
})
|
||||
it('Basic insert. Then delete the whole array', async function (done) {
|
||||
}))
|
||||
it('Basic insert. Then delete the whole array', co.wrap(function * (done) {
|
||||
var l1, l2, l3
|
||||
l1 = await y1.set('Array', Y.Array)
|
||||
l1 = yield y1.set('Array', Y.Array)
|
||||
l1.insert(0, ['x', 'y', 'z'])
|
||||
await flushAll()
|
||||
yield flushAll()
|
||||
l1.delete(0, 3)
|
||||
l2 = await y2.get('Array')
|
||||
l3 = await y3.get('Array')
|
||||
await flushAll()
|
||||
l2 = yield y2.get('Array')
|
||||
l3 = yield y3.get('Array')
|
||||
yield flushAll()
|
||||
expect(l1.toArray()).toEqual(l2.toArray())
|
||||
expect(l2.toArray()).toEqual(l3.toArray())
|
||||
expect(l2.toArray()).toEqual([])
|
||||
done()
|
||||
})
|
||||
it('Basic insert. Then delete the whole array (merge listeners on late sync)', async function (done) {
|
||||
}))
|
||||
it('Basic insert. Then delete the whole array (merge listeners on late sync)', co.wrap(function * (done) {
|
||||
var l1, l2, l3
|
||||
l1 = await y1.set('Array', Y.Array)
|
||||
l1 = yield y1.set('Array', Y.Array)
|
||||
l1.insert(0, ['x', 'y', 'z'])
|
||||
await flushAll()
|
||||
yield flushAll()
|
||||
yconfig2.disconnect()
|
||||
l1.delete(0, 3)
|
||||
l2 = await y2.get('Array')
|
||||
await wait()
|
||||
l2 = yield y2.get('Array')
|
||||
yield wait()
|
||||
yconfig2.reconnect()
|
||||
await wait()
|
||||
l3 = await y3.get('Array')
|
||||
await flushAll()
|
||||
yield wait()
|
||||
l3 = yield y3.get('Array')
|
||||
yield flushAll()
|
||||
expect(l1.toArray()).toEqual(l2.toArray())
|
||||
expect(l2.toArray()).toEqual(l3.toArray())
|
||||
expect(l2.toArray()).toEqual([])
|
||||
done()
|
||||
})
|
||||
it('Basic insert. Then delete the whole array (merge deleter on late sync)', async function (done) {
|
||||
}))
|
||||
it('Basic insert. Then delete the whole array (merge deleter on late sync)', co.wrap(function * (done) {
|
||||
var l1, l2, l3
|
||||
l1 = await y1.set('Array', Y.Array)
|
||||
l1 = yield y1.set('Array', Y.Array)
|
||||
l1.insert(0, ['x', 'y', 'z'])
|
||||
await flushAll()
|
||||
yield flushAll()
|
||||
yconfig1.disconnect()
|
||||
l1.delete(0, 3)
|
||||
l2 = await y2.get('Array')
|
||||
await wait()
|
||||
l2 = yield y2.get('Array')
|
||||
yield wait()
|
||||
yconfig1.reconnect()
|
||||
await wait()
|
||||
l3 = await y3.get('Array')
|
||||
await flushAll()
|
||||
yield wait()
|
||||
l3 = yield y3.get('Array')
|
||||
yield flushAll()
|
||||
expect(l1.toArray()).toEqual(l2.toArray())
|
||||
expect(l2.toArray()).toEqual(l3.toArray())
|
||||
expect(l2.toArray()).toEqual([])
|
||||
done()
|
||||
})
|
||||
it('throw insert & delete events', async function (done) {
|
||||
var array = await this.users[0].root.set('array', Y.Array)
|
||||
}))
|
||||
it('throw insert & delete events', co.wrap(function * (done) {
|
||||
var array = yield this.users[0].root.set('array', Y.Array)
|
||||
var event
|
||||
array.observe(function (e) {
|
||||
event = e
|
||||
@ -179,30 +179,30 @@ describe('Array Type', function () {
|
||||
index: 0,
|
||||
length: 1
|
||||
}])
|
||||
await wait(50)
|
||||
yield wait(50)
|
||||
done()
|
||||
})
|
||||
it('garbage collects', async function (done) {
|
||||
}))
|
||||
it('garbage collects', co.wrap(function * (done) {
|
||||
var l1, l2, l3
|
||||
l1 = await y1.set('Array', Y.Array)
|
||||
l1 = yield y1.set('Array', Y.Array)
|
||||
l1.insert(0, ['x', 'y', 'z'])
|
||||
await flushAll()
|
||||
yield flushAll()
|
||||
yconfig1.disconnect()
|
||||
l1.delete(0, 3)
|
||||
l2 = await y2.get('Array')
|
||||
await wait()
|
||||
l2 = yield y2.get('Array')
|
||||
yield wait()
|
||||
yconfig1.reconnect()
|
||||
await wait()
|
||||
l3 = await y3.get('Array')
|
||||
await flushAll()
|
||||
await garbageCollectAllUsers(this.users)
|
||||
yield wait()
|
||||
l3 = yield y3.get('Array')
|
||||
yield flushAll()
|
||||
yield garbageCollectAllUsers(this.users)
|
||||
yconfig1.db.logTable()
|
||||
expect(l1.toArray()).toEqual(l2.toArray())
|
||||
expect(l2.toArray()).toEqual(l3.toArray())
|
||||
expect(l2.toArray()).toEqual([])
|
||||
await compareAllUsers(this.users)
|
||||
yield compareAllUsers(this.users)
|
||||
done()
|
||||
})
|
||||
}))
|
||||
})
|
||||
describe(`Random tests`, function () {
|
||||
var randomArrayTransactions = [
|
||||
@ -227,29 +227,29 @@ describe('Array Type', function () {
|
||||
}
|
||||
}
|
||||
}
|
||||
beforeEach(async function (done) {
|
||||
await this.users[0].root.set('Array', Y.Array)
|
||||
await flushAll()
|
||||
beforeEach(co.wrap(function * (done) {
|
||||
yield this.users[0].root.set('Array', Y.Array)
|
||||
yield flushAll()
|
||||
|
||||
var promises = []
|
||||
for (var u = 0; u < this.users.length; u++) {
|
||||
promises.push(this.users[u].root.get('Array'))
|
||||
}
|
||||
this.arrays = await Promise.all(promises)
|
||||
this.arrays = yield Promise.all(promises)
|
||||
done()
|
||||
})
|
||||
it('arrays.length equals users.length', async function (done) { // eslint-disable-line
|
||||
}))
|
||||
it('arrays.length equals users.length', co.wrap(function * (done) { // eslint-disable-line
|
||||
expect(this.arrays.length).toEqual(this.users.length)
|
||||
done()
|
||||
})
|
||||
it(`succeed after ${numberOfYArrayTests} actions`, async function (done) {
|
||||
}))
|
||||
it(`succeed after ${numberOfYArrayTests} actions`, co.wrap(function * (done) {
|
||||
for (var u of this.users) {
|
||||
u.connector.debug = true
|
||||
}
|
||||
await applyRandomTransactions(this.users, this.arrays, randomArrayTransactions, numberOfYArrayTests)
|
||||
await flushAll()
|
||||
await compareArrayValues(this.arrays)
|
||||
yield applyRandomTransactions(this.users, this.arrays, randomArrayTransactions, numberOfYArrayTests)
|
||||
yield flushAll()
|
||||
yield compareArrayValues(this.arrays)
|
||||
done()
|
||||
})
|
||||
}))
|
||||
})
|
||||
})
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* global createUsers, Y, compareAllUsers, getRandomNumber, applyRandomTransactions */
|
||||
/* global createUsers, Y, compareAllUsers, getRandomNumber, applyRandomTransactions, co */
|
||||
/* eslint-env browser,jasmine */
|
||||
|
||||
var numberOfYMapTests = 100
|
||||
@ -7,127 +7,127 @@ describe('Map Type', function () {
|
||||
var y1, y2, y3, y4, flushAll
|
||||
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 50000
|
||||
beforeEach(async function (done) {
|
||||
await createUsers(this, 5)
|
||||
beforeEach(co.wrap(function * (done) {
|
||||
yield createUsers(this, 5)
|
||||
y1 = this.users[0].root
|
||||
y2 = this.users[1].root
|
||||
y3 = this.users[2].root
|
||||
y4 = this.users[3].root
|
||||
flushAll = this.users[0].connector.flushAll
|
||||
done()
|
||||
})
|
||||
afterEach(async function(done) {
|
||||
await compareAllUsers(this.users)
|
||||
}))
|
||||
afterEach(co.wrap(function * (done) {
|
||||
yield compareAllUsers(this.users)
|
||||
done()
|
||||
}, 5000)
|
||||
}), 5000)
|
||||
|
||||
describe('Basic tests', function () {
|
||||
it('Basic get&set of Map property (converge via sync)', async function (done) {
|
||||
it('Basic get&set of Map property (converge via sync)', co.wrap(function * (done) {
|
||||
y1.set('stuff', 'stuffy')
|
||||
expect(y1.get('stuff')).toEqual('stuffy')
|
||||
await flushAll()
|
||||
yield flushAll()
|
||||
for (var key in this.users) {
|
||||
var u = this.users[key].root
|
||||
expect(u.get('stuff')).toEqual('stuffy')
|
||||
}
|
||||
await compareAllUsers(this.users)
|
||||
yield compareAllUsers(this.users)
|
||||
done()
|
||||
})
|
||||
it('Map can set custom types (Map)', async function (done) {
|
||||
var map = await y1.set('Map', Y.Map)
|
||||
}))
|
||||
it('Map can set custom types (Map)', co.wrap(function * (done) {
|
||||
var map = yield y1.set('Map', Y.Map)
|
||||
map.set('one', 1)
|
||||
map = await y1.get('Map')
|
||||
map = yield y1.get('Map')
|
||||
expect(map.get('one')).toEqual(1)
|
||||
await compareAllUsers(this.users)
|
||||
yield compareAllUsers(this.users)
|
||||
done()
|
||||
})
|
||||
it('Map can set custom types (Array)', async function (done) {
|
||||
var array = await y1.set('Array', Y.Array)
|
||||
}))
|
||||
it('Map can set custom types (Array)', co.wrap(function * (done) {
|
||||
var array = yield y1.set('Array', Y.Array)
|
||||
array.insert(0, [1, 2, 3])
|
||||
array = await y1.get('Array')
|
||||
array = yield y1.get('Array')
|
||||
expect(array.toArray()).toEqual([1, 2, 3])
|
||||
await compareAllUsers(this.users)
|
||||
yield compareAllUsers(this.users)
|
||||
done()
|
||||
})
|
||||
it('Basic get&set of Map property (converge via update)', async function (done) {
|
||||
await flushAll()
|
||||
}))
|
||||
it('Basic get&set of Map property (converge via update)', co.wrap(function * (done) {
|
||||
yield flushAll()
|
||||
y1.set('stuff', 'stuffy')
|
||||
expect(y1.get('stuff')).toEqual('stuffy')
|
||||
|
||||
await flushAll()
|
||||
yield flushAll()
|
||||
for (var key in this.users) {
|
||||
var r = this.users[key].root
|
||||
expect(r.get('stuff')).toEqual('stuffy')
|
||||
}
|
||||
done()
|
||||
})
|
||||
it('Basic get&set of Map property (handle conflict)', async function (done) {
|
||||
await flushAll()
|
||||
}))
|
||||
it('Basic get&set of Map property (handle conflict)', co.wrap(function * (done) {
|
||||
yield flushAll()
|
||||
y1.set('stuff', 'c0')
|
||||
|
||||
y2.set('stuff', 'c1')
|
||||
|
||||
await flushAll()
|
||||
yield flushAll()
|
||||
for (var key in this.users) {
|
||||
var u = this.users[key]
|
||||
expect(u.root.get('stuff')).toEqual('c0')
|
||||
}
|
||||
await compareAllUsers(this.users)
|
||||
yield compareAllUsers(this.users)
|
||||
done()
|
||||
})
|
||||
it('Basic get&set&delete of Map property (handle conflict)', async function (done) {
|
||||
await flushAll()
|
||||
}))
|
||||
it('Basic get&set&delete of Map property (handle conflict)', co.wrap(function * (done) {
|
||||
yield flushAll()
|
||||
y1.set('stuff', 'c0')
|
||||
y1.delete('stuff')
|
||||
y2.set('stuff', 'c1')
|
||||
await flushAll()
|
||||
yield flushAll()
|
||||
|
||||
for (var key in this.users) {
|
||||
var u = this.users[key]
|
||||
expect(u.root.get('stuff')).toBeUndefined()
|
||||
}
|
||||
await compareAllUsers(this.users)
|
||||
yield compareAllUsers(this.users)
|
||||
done()
|
||||
})
|
||||
it('Basic get&set of Map property (handle three conflicts)', async function (done) {
|
||||
await flushAll()
|
||||
}))
|
||||
it('Basic get&set of Map property (handle three conflicts)', co.wrap(function * (done) {
|
||||
yield flushAll()
|
||||
y1.set('stuff', 'c0')
|
||||
y2.set('stuff', 'c1')
|
||||
y2.set('stuff', 'c2')
|
||||
y3.set('stuff', 'c3')
|
||||
await flushAll()
|
||||
yield flushAll()
|
||||
|
||||
for (var key in this.users) {
|
||||
var u = this.users[key]
|
||||
expect(u.root.get('stuff')).toEqual('c0')
|
||||
}
|
||||
await compareAllUsers(this.users)
|
||||
yield compareAllUsers(this.users)
|
||||
done()
|
||||
})
|
||||
it('Basic get&set&delete of Map property (handle three conflicts)', async function (done) {
|
||||
await flushAll()
|
||||
}))
|
||||
it('Basic get&set&delete of Map property (handle three conflicts)', co.wrap(function * (done) {
|
||||
yield flushAll()
|
||||
y1.set('stuff', 'c0')
|
||||
y2.set('stuff', 'c1')
|
||||
y2.set('stuff', 'c2')
|
||||
y3.set('stuff', 'c3')
|
||||
await flushAll()
|
||||
yield flushAll()
|
||||
y1.set('stuff', 'deleteme')
|
||||
y1.delete('stuff')
|
||||
y2.set('stuff', 'c1')
|
||||
y3.set('stuff', 'c2')
|
||||
y4.set('stuff', 'c3')
|
||||
await flushAll()
|
||||
yield flushAll()
|
||||
|
||||
for (var key in this.users) {
|
||||
var u = this.users[key]
|
||||
expect(u.root.get('stuff')).toBeUndefined()
|
||||
}
|
||||
await compareAllUsers(this.users)
|
||||
yield compareAllUsers(this.users)
|
||||
done()
|
||||
})
|
||||
it('throws add & update & delete events (with type and primitive content)', async function (done) {
|
||||
}))
|
||||
it('throws add & update & delete events (with type and primitive content)', co.wrap(function * (done) {
|
||||
var event
|
||||
await flushAll()
|
||||
yield flushAll()
|
||||
y1.observe(function (e) {
|
||||
event = e // just put it on event, should be thrown synchronously anyway
|
||||
})
|
||||
@ -138,7 +138,7 @@ describe('Map Type', function () {
|
||||
name: 'stuff'
|
||||
}])
|
||||
// update, oldValue is in contents
|
||||
await y1.set('stuff', Y.Array)
|
||||
yield y1.set('stuff', Y.Array)
|
||||
expect(event).toEqual([{
|
||||
type: 'update',
|
||||
object: y1,
|
||||
@ -164,7 +164,7 @@ describe('Map Type', function () {
|
||||
done()
|
||||
})
|
||||
})
|
||||
})
|
||||
}))
|
||||
})
|
||||
describe(`${numberOfYMapTests} Random tests`, function () {
|
||||
var randomMapTransactions = [
|
||||
@ -186,22 +186,22 @@ describe('Map Type', function () {
|
||||
}
|
||||
}
|
||||
}
|
||||
beforeEach(async function (done) {
|
||||
await y1.set('Map', Y.Map)
|
||||
await flushAll()
|
||||
beforeEach(co.wrap(function * (done) {
|
||||
yield y1.set('Map', Y.Map)
|
||||
yield flushAll()
|
||||
|
||||
var promises = []
|
||||
for (var u = 0; u < this.users.length; u++) {
|
||||
promises.push(this.users[u].root.get('Map'))
|
||||
}
|
||||
this.maps = await Promise.all(promises)
|
||||
this.maps = yield Promise.all(promises)
|
||||
done()
|
||||
})
|
||||
it(`succeed after ${numberOfYMapTests} actions`, async function (done) {
|
||||
await applyRandomTransactions(this.users, this.maps, randomMapTransactions, numberOfYMapTests)
|
||||
await flushAll()
|
||||
await compareMapValues(this.maps)
|
||||
}))
|
||||
it(`succeed after ${numberOfYMapTests} actions`, co.wrap(function * (done) {
|
||||
yield applyRandomTransactions(this.users, this.maps, randomMapTransactions, numberOfYMapTests)
|
||||
yield flushAll()
|
||||
yield compareMapValues(this.maps)
|
||||
done()
|
||||
})
|
||||
}))
|
||||
})
|
||||
})
|
||||
|
@ -1,4 +1,6 @@
|
||||
/* global Y, CustomType */
|
||||
/* global Y */
|
||||
|
||||
var CustomType = Y.CustomType
|
||||
|
||||
;(function () {
|
||||
class YTextBind extends Y . Array . class {
|
||||
|
@ -1,5 +1,8 @@
|
||||
/* global copyObject, compareIds */
|
||||
/* global Y */
|
||||
'use strict'
|
||||
|
||||
var compareIds = Y.compareIds
|
||||
var copyObject = Y.copyObject
|
||||
var GeneratorFunction = (function *() {}).constructor;// eslint-disable-line
|
||||
|
||||
class EventHandler { // eslint-disable-line
|
||||
|
14
src/y.js
14
src/y.js
@ -1,4 +1,5 @@
|
||||
/* @flow */
|
||||
'use strict'
|
||||
|
||||
function Y (opts) {
|
||||
var def = Promise.defer()
|
||||
@ -35,10 +36,13 @@ class YConfig { // eslint-disable-line no-unused-vars
|
||||
disconnect () {
|
||||
this.connector.disconnect()
|
||||
}
|
||||
async reconnect () {
|
||||
await this.db.garbageCollect()
|
||||
await this.db.garbageCollect()
|
||||
this.connector.reconnect()
|
||||
reconnect () {
|
||||
Promise.all([
|
||||
this.db.garbageCollect(),
|
||||
this.db.garbageCollect()
|
||||
]).then(function () {
|
||||
this.connector.reconnect()
|
||||
})
|
||||
}
|
||||
destroy () {
|
||||
this.connector.disconnect()
|
||||
@ -50,3 +54,5 @@ class YConfig { // eslint-disable-line no-unused-vars
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (g) g.Y = Y //eslint-disable-line
|
||||
|
Loading…
x
Reference in New Issue
Block a user