node-inspector

This commit is contained in:
Kevin Jahns 2015-09-10 19:41:07 +02:00
parent b9e21665e2
commit 4bfe484fc2
18 changed files with 309 additions and 217 deletions

View File

@ -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'))

4
q.js Normal file
View File

@ -0,0 +1,4 @@
'use strict';
class YY {
}

16
spec/support/jasmine.json Normal file
View 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"
]
}

View File

@ -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) {

View File

@ -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]

View File

@ -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)
})

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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) {

View File

@ -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!

View File

@ -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()
})
}))
})
})

View File

@ -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()
})
}))
})
})

View File

@ -1,4 +1,6 @@
/* global Y, CustomType */
/* global Y */
var CustomType = Y.CustomType
;(function () {
class YTextBind extends Y . Array . class {

View File

@ -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

View File

@ -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

17
test.js Normal file
View File

@ -0,0 +1,17 @@
'use strict';
function * aaa (){}
class X {
stuff () {
console.log("yay")
var r = function * () {
yield "dtrn"
}
var test = r()
console.dir(r())
}
}
(new X).stuff()