fixed bugs that came wih the last commit

This commit is contained in:
Kevin Jahns 2015-07-17 10:34:43 +02:00
parent 4a7f09c32d
commit a4f7f5c987
4 changed files with 64 additions and 50 deletions

View File

@ -36,6 +36,7 @@
"applyRandomTransactions": true, "applyRandomTransactions": true,
"CustomType": true, "CustomType": true,
"window": true, "window": true,
"document": true "document": true,
"smaller": true
} }
} }

View File

@ -149,8 +149,8 @@ class AbstractConnector { //eslint-disable-line no-unused-vars
let conn = this; let conn = this;
this.y.db.requestTransaction(function*(){ this.y.db.requestTransaction(function*(){
var ops = yield* this.getOperations(m.stateVector); var ops = yield* this.getOperations(m.stateVector);
conn.broadcastedHB = true;
if (ops.length > 0) { if (ops.length > 0) {
conn.broadcastedHB = true;
conn.broadcast({ conn.broadcast({
type: "update", type: "update",
ops: ops ops: ops

View File

@ -113,6 +113,9 @@ class RBTree { //eslint-disable-line no-unused-vars
this.length = 0; this.length = 0;
} }
findNodeWithLowerBound (from) { findNodeWithLowerBound (from) {
if (from === void 0) {
throw new Error("You must define from!");
}
var o = this.root; var o = this.root;
if (o === null) { if (o === null) {
return false; return false;
@ -122,7 +125,7 @@ class RBTree { //eslint-disable-line no-unused-vars
// o is included in the bound // o is included in the bound
// try to find an element that is closer to the bound // try to find an element that is closer to the bound
o = o.left; o = o.left;
} else if (smaller(o.val.id, from)) { } else if (from !== null && smaller(o.val.id, from)) {
// o is not within the bound, maybe one of the right elements is.. // o is not within the bound, maybe one of the right elements is..
if (o.right !== null) { if (o.right !== null) {
o = o.right; o = o.right;
@ -149,6 +152,9 @@ class RBTree { //eslint-disable-line no-unused-vars
return this.findNode(id).val; return this.findNode(id).val;
} }
findNode (id) { findNode (id) {
if (id == null || id.constructor !== Array) {
throw new Error("Expect id to be an array!");
}
var o = this.root; var o = this.root;
if (o === null) { if (o === null) {
return false; return false;
@ -168,6 +174,9 @@ class RBTree { //eslint-disable-line no-unused-vars
} }
} }
delete (id) { delete (id) {
if (id == null || id.constructor !== Array) {
throw new Error("id is expected to be an Array!");
}
var d = this.findNode(id); var d = this.findNode(id);
if (d == null) { if (d == null) {
throw new Error("Element does not exist!"); throw new Error("Element does not exist!");
@ -307,6 +316,9 @@ class RBTree { //eslint-disable-line no-unused-vars
} }
} }
add (v) { add (v) {
if (v == null || v.id == null || v.id.constructor !== Array) {
throw new Error("v is expected to have an id property which is an Array!");
}
var node = new N(v); var node = new N(v);
if (this.root !== null) { if (this.root !== null) {
var p = this.root; // p abbrev. parent var p = this.root; // p abbrev. parent

View File

@ -54,56 +54,56 @@ describe("RedBlack Tree", function(){
this.tree = new RBTree(); this.tree = new RBTree();
}); });
it("can add&retrieve 5 elements", function(){ it("can add&retrieve 5 elements", function(){
this.tree.add({val: "four", id: 4}); this.tree.add({val: "four", id: [4]});
this.tree.add({val: "one", id: 1}); this.tree.add({val: "one", id: [1]});
this.tree.add({val: "three", id: 3}); this.tree.add({val: "three", id: [3]});
this.tree.add({val: "two", id: 2}); this.tree.add({val: "two", id: [2]});
this.tree.add({val: "five", id: 5}); this.tree.add({val: "five", id: [5]});
expect(this.tree.find(1).val).toEqual("one"); expect(this.tree.find([1]).val).toEqual("one");
expect(this.tree.find(2).val).toEqual("two"); expect(this.tree.find([2]).val).toEqual("two");
expect(this.tree.find(3).val).toEqual("three"); expect(this.tree.find([3]).val).toEqual("three");
expect(this.tree.find(4).val).toEqual("four"); expect(this.tree.find([4]).val).toEqual("four");
expect(this.tree.find(5).val).toEqual("five"); expect(this.tree.find([5]).val).toEqual("five");
}); });
it("5 elements do not exist anymore after deleting them", function(){ it("5 elements do not exist anymore after deleting them", function(){
this.tree.add({val: "four", id: 4}); this.tree.add({val: "four", id: [4]});
this.tree.add({val: "one", id: 1}); this.tree.add({val: "one", id: [1]});
this.tree.add({val: "three", id: 3}); this.tree.add({val: "three", id: [3]});
this.tree.add({val: "two", id: 2}); this.tree.add({val: "two", id: [2]});
this.tree.add({val: "five", id: 5}); this.tree.add({val: "five", id: [5]});
this.tree.delete(4); this.tree.delete([4]);
expect(this.tree.find(4)).not.toBeTruthy(); expect(this.tree.find([4])).not.toBeTruthy();
this.tree.delete(3); this.tree.delete([3]);
expect(this.tree.find(3)).not.toBeTruthy(); expect(this.tree.find([3])).not.toBeTruthy();
this.tree.delete(2); this.tree.delete([2]);
expect(this.tree.find(2)).not.toBeTruthy(); expect(this.tree.find([2])).not.toBeTruthy();
this.tree.delete(1); this.tree.delete([1]);
expect(this.tree.find(1)).not.toBeTruthy(); expect(this.tree.find([1])).not.toBeTruthy();
this.tree.delete(5); this.tree.delete([5]);
expect(this.tree.find(5)).not.toBeTruthy(); expect(this.tree.find([5])).not.toBeTruthy();
}); });
it("debug #1", function(){ it("debug #1", function(){
this.tree.add({id: 2}); this.tree.add({id: [2]});
this.tree.add({id: 0}); this.tree.add({id: [0]});
this.tree.delete(2); this.tree.delete([2]);
this.tree.add({id: 1}); this.tree.add({id: [1]});
expect(this.tree.find(0)).not.toBeUndefined(); expect(this.tree.find([0])).not.toBeUndefined();
expect(this.tree.find(1)).not.toBeUndefined(); expect(this.tree.find([1])).not.toBeUndefined();
expect(this.tree.find(2)).toBeUndefined(); expect(this.tree.find([2])).toBeUndefined();
}); });
describe("debug #2", function(){ describe("debug #2", function(){
var tree = new RBTree(); var tree = new RBTree();
tree.add({id: 8433}); tree.add({id: [8433]});
tree.add({id: 12844}); tree.add({id: [12844]});
tree.add({id: 1795}); tree.add({id: [1795]});
tree.add({id: 30302}); tree.add({id: [30302]});
tree.add({id: 64287}); tree.add({id: [64287]});
tree.delete(8433); tree.delete([8433]);
tree.add({id: 28996}); tree.add({id: [28996]});
tree.delete(64287); tree.delete([64287]);
tree.add({id: 22721}); tree.add({id: [22721]});
itRootNodeIsBlack(tree, []); itRootNodeIsBlack(tree, []);
itBlackHeightOfSubTreesAreEqual(tree, []); itBlackHeightOfSubTreesAreEqual(tree, []);
@ -115,13 +115,13 @@ describe("RedBlack Tree", function(){
for(var i = 0; i < numberOfRBTreeTests; i++) { for(var i = 0; i < numberOfRBTreeTests; i++) {
var r = Math.random(); var r = Math.random();
if (r < 0.8) { if (r < 0.8) {
var obj = Math.floor(Math.random() * numberOfRBTreeTests * 10000); var obj = [Math.floor(Math.random() * numberOfRBTreeTests * 10000)];
elements.push(obj); elements.push(obj);
tree.add({id: obj}); tree.add({id: obj});
} else if (elements.length > 0) { } else if (elements.length > 0) {
var elemid = Math.floor(Math.random() * elements.length); var elemid = Math.floor(Math.random() * elements.length);
var elem = elements[elemid]; var elem = elements[elemid];
elements = elements.filter(function(e){return e != elem; }); //eslint-disable-line elements = elements.filter(function(e){return !compareIds(e,elem); }); //eslint-disable-line
tree.delete(elem); tree.delete(elem);
} }
} }
@ -145,7 +145,7 @@ describe("RedBlack Tree", function(){
it("iterating over a tree with lower bound yields the right amount of results", function(){ it("iterating over a tree with lower bound yields the right amount of results", function(){
var lowerBound = elements[Math.floor(Math.random() * elements.length)]; var lowerBound = elements[Math.floor(Math.random() * elements.length)];
var expectedResults = elements.filter(function(e, pos){ var expectedResults = elements.filter(function(e, pos){
return e >= lowerBound && elements.indexOf(e) === pos; return (smaller(lowerBound, e) || compareIds(e, lowerBound)) && elements.indexOf(e) === pos;
}).length; }).length;
var actualResults = 0; var actualResults = 0;
@ -172,7 +172,7 @@ describe("RedBlack Tree", function(){
it("iterating over a tree with upper bound yields the right amount of results", function(){ it("iterating over a tree with upper bound yields the right amount of results", function(){
var upperBound = elements[Math.floor(Math.random() * elements.length)]; var upperBound = elements[Math.floor(Math.random() * elements.length)];
var expectedResults = elements.filter(function(e, pos){ var expectedResults = elements.filter(function(e, pos){
return e <= upperBound && elements.indexOf(e) === pos; return (smaller(e, upperBound) || compareIds(e, upperBound)) && elements.indexOf(e) === pos;
}).length; }).length;
var actualResults = 0; var actualResults = 0;
@ -187,7 +187,7 @@ describe("RedBlack Tree", function(){
var b1 = elements[Math.floor(Math.random() * elements.length)]; var b1 = elements[Math.floor(Math.random() * elements.length)];
var b2 = elements[Math.floor(Math.random() * elements.length)]; var b2 = elements[Math.floor(Math.random() * elements.length)];
var upperBound, lowerBound; var upperBound, lowerBound;
if (b1 < b2) { if (smaller(b1, b2)) {
lowerBound = b1; lowerBound = b1;
upperBound = b2; upperBound = b2;
} else { } else {
@ -195,7 +195,8 @@ describe("RedBlack Tree", function(){
upperBound = b1; upperBound = b1;
} }
var expectedResults = elements.filter(function(e, pos){ var expectedResults = elements.filter(function(e, pos){
return e >= lowerBound && e <= upperBound && elements.indexOf(e) === pos; return (smaller(lowerBound, e) || compareIds(e, lowerBound))
&& (smaller(e, upperBound) || compareIds(e, upperBound)) && elements.indexOf(e) === pos;
}).length; }).length;
var actualResults = 0; var actualResults = 0;
tree.iterate(lowerBound, upperBound, function(val){ tree.iterate(lowerBound, upperBound, function(val){