ydn.db
Version:
Javascript database library for IndexedDB, WebDatabase (WebSQL) and WebStorage (localStorage) storage mechanisms supporting version migration, advanced query and transaction workflow.
217 lines (163 loc) • 5.67 kB
JavaScript
goog.require('goog.debug.Console');
goog.require('goog.testing.jsunit');
goog.require('ydn.db.crud.Storage');
goog.require('ydn.debug');
var reachedFinalContinuation, schema, debug_console, db, objs;
var db_name = 'test_kr_6';
var store_name = 'st';
var setUp = function () {
// ydn.debug.log('ydn.db', 'finest');
objs = [
{id: -3, value: 'a0', remark: 'test ' + Math.random()},
{id: 0, value: 'a2', remark: 'test ' + Math.random()},
{id: 1, value: 'ba', remark: 'test ' + Math.random()},
{id: 3, value: 'bc', remark: 'test ' + Math.random()},
{id: 10, value: 'c', remark: 'test ' + Math.random()},
{id: 11, value: 'c1', remark: 'test ' + Math.random()},
{id: 20, value: 'ca', remark: 'test ' + Math.random()}
];
db.clear(store_name);
db.put(store_name, objs).addCallback(function (value) {
console.log(db + ' ready.');
});
};
var setUpPage = function () {
var value_index = new ydn.db.schema.Index('value', ydn.db.schema.DataType.TEXT, true);
var store_schema = new ydn.db.schema.Store(store_name, 'id', false,
ydn.db.schema.DataType.INTEGER, [value_index]);
schema = new ydn.db.schema.Database(undefined, [store_schema]);
db = new ydn.db.crud.Storage(db_name, schema, options);
};
var tearDown = function() {
assertTrue('The final continuation was not reached', reachedFinalContinuation);
};
var tearDownPage = function() {
ydn.db.deleteDatabase(db.getName(), db.getType());
db.close();
}
/**
*
* @param {ydn.db.KeyRange} key_range
* @param {*} exp_result
* @param {boolean=} reverse
*/
var keyRange_test = function (key_range, exp_result, reverse) {
var done;
var result;
waitForCondition(
// Condition
function () {
return done;
},
// Continuation
function () {
assertArrayEquals(JSON.stringify(key_range.toJSON()), exp_result, result);
reachedFinalContinuation = true;
},
100, // interval
1000); // maxTimeout
reverse = !!reverse;
var req = db.values(store_name, key_range, undefined, undefined, reverse);
req.addBoth(function (value) {
//console.log(db + ' fetch value: ' + JSON.stringify(value));
result = value;
done = true;
});
};
var test_integer_only = function () {
var key_range = ydn.db.KeyRange.only(3);
keyRange_test(key_range, objs.slice(3, 4));
};
var test_integer_lower_close = function () {
var key_range = ydn.db.KeyRange.lowerBound(3);
keyRange_test(key_range, objs.slice(3, objs.length));
};
var test_integer_lower_open = function () {
var key_range = ydn.db.KeyRange.lowerBound(3, true);
keyRange_test(key_range, objs.slice(4, objs.length));
};
var test_integer_upper_close = function () {
var key_range = ydn.db.KeyRange.upperBound(3);
keyRange_test(key_range, objs.slice(0, 4));
};
var test_integer_upper_open = function () {
var key_range = ydn.db.KeyRange.upperBound(3, true);
keyRange_test(key_range, objs.slice(0, 3));
};
var test_integer_close_close = function () {
var key_range = ydn.db.KeyRange.bound(0, 3);
keyRange_test(key_range, objs.slice(1, 4));
};
var test_integer_close_close_reverse = function () {
var key_range = ydn.db.KeyRange.bound(0, 3);
keyRange_test(key_range, objs.slice(1, 4).reverse(), true);
};
var test_integer_open_close = function () {
var key_range = ydn.db.KeyRange.bound(0, 3, true);
keyRange_test(key_range, objs.slice(2, 4));
};
var test_integer_open_open = function () {
var key_range = ydn.db.KeyRange.bound(0, 3, true, true);
keyRange_test(key_range, objs.slice(2, 3));
};
//var test_store_string_index_wise_revrse = function () {
// keyRange_test(null, objs.reverse(), true);
//};
var test_query_start_with = function () {
var store_name = 'ts1';
var db_name = 'test_crud_6';
// NOTE: key also need to be indexed.
var indexSchema = new ydn.db.schema.Index('value', ydn.db.schema.DataType.NUMERIC, true);
var stores = [new ydn.db.schema.Store(store_name, 'id', false, ydn.db.schema.DataType.TEXT, [indexSchema])];
//schema.addStore(new ydn.db.schema.Store(store_name, 'id'));
var schema = new ydn.db.schema.Database(undefined, stores);
var db = new ydn.db.crud.Storage(db_name, schema, options);
var objs = [
{id:'qs1', value:Math.random()},
{id:'qs2', value:Math.random()},
{id:'qt', value:Math.random()}
];
var put_value_received;
var put_done;
waitForCondition(
// Condition
function () {
return put_done;
},
// Continuation
function () {
assertArrayEquals('put objs', [objs[0].id, objs[1].id, objs[2].id],
put_value_received);
var get_done;
var get_value_received;
waitForCondition(
// Condition
function () {
return get_done;
},
// Continuation
function () {
reachedFinalContinuation = true;
},
100, // interval
1000); // maxTimeout
var key_range = ydn.db.KeyRange.starts('qs');
db.values(store_name, key_range).addCallback(function (value) {
console.log('fetch value: ' + JSON.stringify(value));
assertEquals('obj length', objs.length - 1, value.length);
assertObjectEquals('get', objs[0], value[0]);
assertObjectEquals('get', objs[1], value[1]);
get_done = true;
});
},
100, // interval
1000); // maxTimeout
db.put(store_name, objs).addCallback(function (value) {
console.log(['receiving value callback.', value]);
put_value_received = value;
put_done = true;
});
};
var testCase = new goog.testing.ContinuationTestCase();
testCase.autoDiscoverTests();
G_testRunner.initialize(testCase);