forerunnerdb
Version:
A NoSQL document store database for browsers and Node.js.
368 lines (303 loc) • 10 kB
JavaScript
QUnit.module('ActiveBucket');
ForerunnerDB.moduleLoaded('ActiveBucket', function () {
QUnit.test('Create instance', function () {
var ab = new ForerunnerDB.shared.modules.ActiveBucket({});
ok(ab instanceof ForerunnerDB.shared.modules.ActiveBucket, 'Instance created');
});
QUnit.test('Add document', function () {
var ab = new ForerunnerDB.shared.modules.ActiveBucket({
name: 1,
age: -1
}),
names = ['Rob', 'Jim', 'Alice', 'Sam', 'Bob'],
ages = [15, 18, 22, 27, 33, 41, 47, 52],
total = 1000,
count = total;
while (count--) {
ab.insert({
name: names[Math.floor(Math.random() * names.length)],
age: ages[Math.floor(Math.random() * ages.length)]
});
}
strictEqual(ab.count(), total, 'Correct number of items (' + total + '): ' + ab.count());
});
QUnit.test('Update Document', function () {
base.dbUp();
base.domUp();
var names = ['Rob', 'Jim', 'Alice', 'Sam', 'Bob'],
ages = [15, 18, 22, 27, 33],
total = 5,
count = total,
coll,
view,
obj;
coll = db.collection('test').truncate();
view = db.view('test')
.queryOptions({
$orderBy: {
name: 1,
age: -1
}
})
.from(coll)
.link('#testTarget', {
template: '<li class="item" data-link="id{:_id}">{^{:name}} : {^{:age}}</li>'
});
count = total;
while (count--) {
obj = {
name: names[count],
age: ages[count]
};
coll.insert(obj);
}
count = total;
while (count--) {
obj = {
name: names[count],
age: ages[count]
};
coll.insert(obj);
}
count = total;
while (count--) {
obj = {
name: names[count],
age: ages[count]
};
coll.insert(obj);
}
// Check items
var elems = $('#testTarget').find('.item');
strictEqual(elems.length, 15, "Insert documents");
if(elems.length > 15) {debugger};
// Check sort order
strictEqual($(elems[0]).text(), 'Alice : 22', "Alphabetical 1");
strictEqual($(elems[1]).text(), 'Alice : 22', "Alphabetical 2");
strictEqual($(elems[2]).text(), 'Alice : 22', "Alphabetical 3");
strictEqual($(elems[3]).text(), 'Bob : 33', "Alphabetical 4");
strictEqual($(elems[4]).text(), 'Bob : 33', "Alphabetical 5");
strictEqual($(elems[5]).text(), 'Bob : 33', "Alphabetical 6");
strictEqual($(elems[6]).text(), 'Jim : 18', "Alphabetical 7");
strictEqual($(elems[7]).text(), 'Jim : 18', "Alphabetical 8");
strictEqual($(elems[8]).text(), 'Jim : 18', "Alphabetical 9");
strictEqual($(elems[9]).text(), 'Rob : 15', "Alphabetical 10");
strictEqual($(elems[10]).text(), 'Rob : 15', "Alphabetical 11");
strictEqual($(elems[11]).text(), 'Rob : 15', "Alphabetical 12");
strictEqual($(elems[12]).text(), 'Sam : 27', "Alphabetical 13");
strictEqual($(elems[13]).text(), 'Sam : 27', "Alphabetical 14");
strictEqual($(elems[14]).text(), 'Sam : 27', "Alphabetical 15");
// Remove an item from the collection
var items = coll.find(),
item = items[14];
coll.remove({_id: item._id});
// Check items
var elems = $('#testTarget').find('.item');
strictEqual(elems.length, 14, "Insert documents");
// Check sort order
strictEqual($(elems[0]).text(), 'Alice : 22', "Alphabetical 1");
strictEqual($(elems[1]).text(), 'Alice : 22', "Alphabetical 2");
strictEqual($(elems[2]).text(), 'Alice : 22', "Alphabetical 3");
strictEqual($(elems[3]).text(), 'Bob : 33', "Alphabetical 4");
strictEqual($(elems[4]).text(), 'Bob : 33', "Alphabetical 5");
strictEqual($(elems[5]).text(), 'Bob : 33', "Alphabetical 6");
strictEqual($(elems[6]).text(), 'Jim : 18', "Alphabetical 7");
strictEqual($(elems[7]).text(), 'Jim : 18', "Alphabetical 8");
strictEqual($(elems[8]).text(), 'Jim : 18', "Alphabetical 9");
strictEqual($(elems[9]).text(), 'Rob : 15', "Alphabetical 10");
strictEqual($(elems[10]).text(), 'Rob : 15', "Alphabetical 11");
strictEqual($(elems[11]).text(), 'Sam : 27', "Alphabetical 12");
strictEqual($(elems[12]).text(), 'Sam : 27', "Alphabetical 13");
strictEqual($(elems[13]).text(), 'Sam : 27', "Alphabetical 14");
items = view.find();
item = items[1];
coll.update(item, {name: 'Alice', age: 21});
// Check items
var elems = $('#testTarget').find('.item');
// Check sort order
strictEqual($(elems[0]).text(), 'Alice : 22', "Alphabetical 1");
strictEqual($(elems[1]).text(), 'Alice : 22', "Alphabetical 2");
strictEqual($(elems[2]).text(), 'Alice : 21', "Alphabetical 3");
strictEqual($(elems[3]).text(), 'Bob : 33', "Alphabetical 4");
strictEqual($(elems[4]).text(), 'Bob : 33', "Alphabetical 5");
strictEqual($(elems[5]).text(), 'Bob : 33', "Alphabetical 6");
strictEqual($(elems[6]).text(), 'Jim : 18', "Alphabetical 7");
strictEqual($(elems[7]).text(), 'Jim : 18', "Alphabetical 8");
strictEqual($(elems[8]).text(), 'Jim : 18', "Alphabetical 9");
strictEqual($(elems[9]).text(), 'Rob : 15', "Alphabetical 10");
strictEqual($(elems[10]).text(), 'Rob : 15', "Alphabetical 11");
strictEqual($(elems[11]).text(), 'Sam : 27', "Alphabetical 12");
strictEqual($(elems[12]).text(), 'Sam : 27', "Alphabetical 13");
strictEqual($(elems[13]).text(), 'Sam : 27', "Alphabetical 14");
base.domDown();
base.dbDown();
});
QUnit.test('Add documents, check correct indexes with string and number based sorting', function () {
var ab = new ForerunnerDB.shared.modules.ActiveBucket({
name: 1,
age: -1
}),
names = ['Rob', 'Jim', 'Alice', 'Sam', 'Bob'],
ages = [15, 18, 22, 27, 33, 41, 47, 52],
i, k,
testIndex,
testArr = [],
obj,
objs = [],
index;
for (i = 0; i < names.length; i++) {
for (k = 0; k < ages.length; k++) {
obj = {
name: names[i],
age: ages[k]
};
objs.push(obj);
ab.insert(obj);
}
}
strictEqual(ab.count(), 40, 'Correct number of items: ' + ab.count());
for (i = 0; i < objs.length; i++) {
obj = objs[i];
index = ab.index(obj);
if (testArr[index]) {
testArr.splice(index, 0, obj);
} else {
testArr[index] = obj;
}
}
strictEqual(testArr[31].name === 'Rob' && testArr[31].age, 15, 'Items at correct index');
});
QUnit.test('Add documents, check correct indexes with string-based sorting', function () {
var ab = new ForerunnerDB.shared.modules.ActiveBucket({
name: -1,
_id: 1
}),
names = ['Rob', 'Jim', 'Alice', 'Sam', 'Bob'],
_ids = ['15', '18', '22', '27', '33', '41', '47', '52'],
i, k,
testIndex,
testArr = [],
obj,
objs = [],
index;
for (i = 0; i < names.length; i++) {
for (k = 0; k < _ids.length; k++) {
obj = {
name: names[i],
_id: _ids[k]
};
objs.push(obj);
ab.insert(obj);
}
}
strictEqual(ab.count(), 40, 'Correct number of items: ' + ab.count());
for (i = 0; i < objs.length; i++) {
obj = objs[i];
index = ab.index(obj);
if (testArr[index]) {
testArr.splice(index, 0, obj);
} else {
testArr[index] = obj;
}
}
strictEqual(testArr[0].name === 'Sam' && testArr[0]._id, '15', 'Items at correct index');
});
QUnit.test('Time Performance', function () {
var arr = [],
alpha = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p'],
names = ['Rob', 'Jim', 'Alice', 'Sam', 'Bob'],
ages = [15, 18, 22, 27, 33, 41, 47, 52],
total = 3000,
count = total,
obj,
index,
tmpData;
//buildArr = [{"name":"Sam","age":47},{"name":"Rob","age":41},{"name":"Bob","age":47},{"name":"Alice","age":18},{"name":"Jim","age":33},{"name":"Sam","age":41},{"name":"Jim","age":27}],
//count = buildArr.length;
// Generate names and ages
names = [];
ages = [];
var sd2 = new Date().getTime();
for (var i = 0; i < 10000; i++) {
tmpData = '';
for (var ii = 0; ii < 6; ii++) {
tmpData += alpha[Math.floor(Math.random() * alpha.length)];
}
names.push(tmpData);
tmpData = Math.floor(Math.random() * 60);
ages.push(tmpData);
}
ok(true, 'Generate random data time: ' + (new Date().getTime() - sd2));
var ab = new ForerunnerDB.shared.modules.ActiveBucket({
name: 1,
age: -1
});
var sd2 = new Date().getTime();
while (count--) {
obj = {
name: names[Math.floor(Math.random() * names.length)],
age: ages[Math.floor(Math.random() * ages.length)]
};
index = ab.insert(obj);
}
var tt = (new Date().getTime() - sd2);
ok(Math.ceil(tt / total) < 30, 'Insert ' + total + ' Items Time: ' + tt + 'ms (' + Math.ceil(tt / total) + 'ms per item)');
var sd2 = new Date().getTime();
obj = {
name: names[Math.floor(Math.random() * names.length)],
age: ages[Math.floor(Math.random() * ages.length)]
};
ab.insert(obj);
var tt = (new Date().getTime() - sd2);
ok(tt < 20, 'Individual Item Insert Time: ' + tt + 'ms');
var sd2 = new Date().getTime();
obj = {
name: 'Fred',
age: 19
};
ab.insert(obj);
var tt = (new Date().getTime() - sd2);
ok(tt < 30, 'Non-Normal Item Insert Time: ' + tt + 'ms');
/*for (var i = 0; i < arr.length; i++) {
console.log(arr[i].name + ' ' + arr[i].age);
}*/
/*for (var i = 0; i < ab._data.length; i++) {
console.log(ab._data[i]);
}*/
});
test('ActiveBucket - Add documents, check correct indexes with string-based sorting', function () {
var ab = new ForerunnerDB.shared.modules.ActiveBucket({
name: -1,
_id: 1
}),
names = ['Rob', 'Jim', 'Alice', 'Sam', 'Bob'],
_ids = ['15', '18', '22', '27', '33', '41', '47', '52'],
i, k,
testIndex,
testArr = [],
obj,
objs = [],
index;
for (i = 0; i < names.length; i++) {
for (k = 0; k < _ids.length; k++) {
obj = {
name: names[i],
_id: _ids[k]
};
objs.push(obj);
ab.insert(obj);
}
}
ok(ab.count() === 40, 'Correct number of items: ' + ab.count());
for (i = 0; i < objs.length; i++) {
obj = objs[i];
index = ab.index(obj);
if (testArr[index]) {
testArr.splice(index, 0, obj);
} else {
testArr[index] = obj;
}
}
ok(testArr[0].name === 'Sam' && testArr[0]._id === '15', 'Items at correct index');
});
});