From c95dae3c33cae4aeee438ccf8adebe845b75e6e5 Mon Sep 17 00:00:00 2001
From: Kevin Jahns <kevin.jahns@rwth-aachen.de>
Date: Tue, 6 Oct 2015 14:22:52 +0200
Subject: [PATCH] fixed inconsistency bugs for tests<1000

---
 src/Helper.spec.js                 |  2 +-
 src/OperationStore.js              |  2 +-
 src/OperationStores/Memory.js      | 34 ++++++++++++------
 src/OperationStores/Memory.spec.js | 56 ++++++++++++++++++++++++++++++
 src/Types/Array.spec.js            |  4 +--
 src/Types/Map.spec.js              |  4 +--
 6 files changed, 86 insertions(+), 16 deletions(-)

diff --git a/src/Helper.spec.js b/src/Helper.spec.js
index cda3b4b0..c3655e53 100644
--- a/src/Helper.spec.js
+++ b/src/Helper.spec.js
@@ -36,7 +36,7 @@ function wait (t) {
   return new Promise(function (resolve) {
     setTimeout(function () {
       resolve()
-    }, t * 5)
+    }, t)
   })
 }
 g.wait = wait
diff --git a/src/OperationStore.js b/src/OperationStore.js
index df532a63..3464bd60 100644
--- a/src/OperationStore.js
+++ b/src/OperationStore.js
@@ -207,7 +207,7 @@ class AbstractTransaction {
       yield* this.setOperation(parent)
     }
     yield* this.removeOperation(o.id) // actually remove it from the os
-    yield* this.ds.markGarbageCollected(o.id)
+    this.ds.markGarbageCollected(o.id)
   }
 }
 Y.AbstractTransaction = AbstractTransaction
diff --git a/src/OperationStores/Memory.js b/src/OperationStores/Memory.js
index 983790c6..cf3c869e 100644
--- a/src/OperationStores/Memory.js
+++ b/src/OperationStores/Memory.js
@@ -4,6 +4,8 @@
 class DeleteStore extends Y.utils.RBTree {
   constructor () {
     super()
+    // TODO: debugggg
+    this.mem = []
   }
   isDeleted (id) {
     var n = this.findNodeWithUpperBound(id)
@@ -14,8 +16,10 @@ class DeleteStore extends Y.utils.RBTree {
 
     returns the delete node
   */
-  * markGarbageCollected (id) {
+  markGarbageCollected (id) {
+    this.mem.push({"gc": id})
     var n = this.markDeleted(id)
+    this.mem.pop()
     if (!n.val.gc) {
       if (n.val.id[1] < id[1]) {
         // un-extend left
@@ -30,16 +34,24 @@ class DeleteStore extends Y.utils.RBTree {
       }
       // set gc'd
       n.val.gc = true
-
-      // can extend left?
       var prev = n.prev()
-      if (prev != null && prev.val.gc) {
+      var next = n.next()
+      // can extend left?
+      if (
+        prev != null &&
+        prev.val.gc &&
+        Y.utils.compareIds([prev.val.id[0], prev.val.id[1] + prev.val.len], n.val.id)
+      ) {
         prev.val.len += n.val.len
         super.delete(n.val.id)
+        n = prev
       }
       // can extend right?
-      var next = n.next()
-      if (next != null && next.val.gc) {
+      if (
+        next != null &&
+        next.val.gc &&
+        Y.utils.compareIds([n.val.id[0], n.val.id[1] + n.val.len], next.val.id)
+      ) {
         n.val.len += next.val.len
         super.delete(next.val.id)
       }
@@ -52,12 +64,13 @@ class DeleteStore extends Y.utils.RBTree {
     returns the delete node
   */
   markDeleted (id) {
+    this.mem.push({"del": id})
     var n = this.findNodeWithUpperBound(id)
     if (n != null && n.val.id[0] === id[0]) {
       if (n.val.id[1] <= id[1] && id[1] < n.val.id[1] + n.val.len) {
         // already deleted
         return n
-      } else if (n.val.id[1] + n.val.len === id[1]) {
+      } else if (n.val.id[1] + n.val.len === id[1] && !n.val.gc) {
         // can extend existing deletion
         n.val.len++
       } else {
@@ -70,9 +83,10 @@ class DeleteStore extends Y.utils.RBTree {
     }
     // can extend right?
     var next = n.next()
-    if (next !== null &&
-        Y.utils.compareIds([n.val.id[0], n.val.id[1] + n.val.len], next.val.id) &&
-        next.val.gc === false
+    if (
+      next !== null &&
+      Y.utils.compareIds([n.val.id[0], n.val.id[1] + n.val.len], next.val.id) &&
+      !next.val.gc
     ) {
       n.val.len = n.val.len + next.val.len
       super.delete(next.val.id)
diff --git a/src/OperationStores/Memory.spec.js b/src/OperationStores/Memory.spec.js
index 0a38c5e3..43e88b49 100644
--- a/src/OperationStores/Memory.spec.js
+++ b/src/OperationStores/Memory.spec.js
@@ -25,5 +25,61 @@ describe('Memory', function () {
       ds.markDeleted(['0', 2])
       expect(ds.toDeleteSet()).toEqual({'0': [[2, 3, false]]})
     })
+    it('Debug #1', function () {
+      ds.markDeleted(['166', 0])
+      ds.markDeleted(['166', 2])
+      ds.markDeleted(['166', 0])
+      ds.markDeleted(['166', 2])
+      ds.markGarbageCollected(['166', 2])
+      ds.markDeleted(['166', 1])
+      ds.markDeleted(['166', 3])
+      ds.markGarbageCollected(['166', 3])
+      ds.markDeleted(['166', 0])
+      expect(ds.toDeleteSet()).toEqual({'166': [[0, 2, false], [2, 2, true]]})
+    })
+    it('Debug #2', function () {
+      ds.markDeleted(['293', 0])
+      ds.markDeleted(['291', 2])
+      ds.markDeleted(['291', 2])
+      ds.markGarbageCollected(['293', 0])
+      ds.markDeleted(['293', 1])
+      ds.markGarbageCollected(['291', 2])
+      expect(ds.toDeleteSet()).toEqual({'291': [[2, 1, true]], '293': [[0, 1, true], [1, 1, false]]})
+    })
+    it('Debug #2', function () {
+      ds.markDeleted(['581', 0])
+      ds.markDeleted(['581', 1])
+      ds.markDeleted(['580', 0])
+      ds.markDeleted(['580', 0])
+      ds.markGarbageCollected(['581', 0])
+      ds.markDeleted(['581', 2])
+      ds.markDeleted(['580', 1])
+      ds.markDeleted(['580', 2])
+      ds.markDeleted(['580', 1])
+      ds.markDeleted(['580', 2])
+      ds.markGarbageCollected(['581', 2])
+      ds.markGarbageCollected(['581', 1])
+      ds.markGarbageCollected(['580', 1])
+      expect(ds.toDeleteSet()).toEqual({'580': [[0, 1, false], [1, 1, true], [2, 1, false]], '581': [[0, 3, true]]})
+    })
+    it('Debug #2', function () {
+      ds.markDeleted(['544', 0])
+      ds.markDeleted(['543', 2])
+      ds.markDeleted(['544', 0])
+      ds.markDeleted(['543', 2])
+      ds.markGarbageCollected(['544', 0])
+      ds.markDeleted(['545', 1])
+      ds.markDeleted(['543', 4])
+      ds.markDeleted(['543', 3])
+      ds.markDeleted(['544', 1])
+      ds.markDeleted(['544', 2])
+      ds.markDeleted(['544', 1])
+      ds.markDeleted(['544', 2])
+      ds.markGarbageCollected(['543', 2])
+      ds.markGarbageCollected(['543', 4])
+      ds.markGarbageCollected(['544', 2])
+      ds.markGarbageCollected(['543', 3])
+      expect(ds.toDeleteSet()).toEqual({'543': [[2, 3, true]], '544': [[0, 1, true], [1, 1, false], [2, 1, true]], '545': [[1, 1, false]]})
+    })
   })
 })
diff --git a/src/Types/Array.spec.js b/src/Types/Array.spec.js
index 7d2bf6a1..90e10862 100644
--- a/src/Types/Array.spec.js
+++ b/src/Types/Array.spec.js
@@ -1,8 +1,8 @@
 /* global createUsers, wait, Y, compareAllUsers, getRandomNumber, applyRandomTransactions, async, garbageCollectAllUsers, describeManyTimes */
 /* eslint-env browser,jasmine */
 
-var numberOfYArrayTests = 10
-var repeatArrayTests = 300
+var numberOfYArrayTests = 1000
+var repeatArrayTests = 5
 
 describe('Array Type', function () {
   var y1, y2, y3, yconfig1, yconfig2, yconfig3, flushAll
diff --git a/src/Types/Map.spec.js b/src/Types/Map.spec.js
index 22b173c8..a6496e8f 100644
--- a/src/Types/Map.spec.js
+++ b/src/Types/Map.spec.js
@@ -1,8 +1,8 @@
 /* global createUsers, Y, compareAllUsers, getRandomNumber, applyRandomTransactions, async, describeManyTimes */
 /* eslint-env browser,jasmine */
 
-var numberOfYMapTests = 70
-var repeatMapTeasts = 1
+var numberOfYMapTests = 100
+var repeatMapTeasts = 10
 
 describe('Map Type', function () {
   var y1, y2, y3, y4, flushAll
-- 
GitLab