зеркало из https://github.com/mozilla/gecko-dev.git
462 строки
12 KiB
JavaScript
462 строки
12 KiB
JavaScript
var gStore;
|
|
var gRevisions = [];
|
|
var gCursor;
|
|
var gExpectedEvents = true;
|
|
|
|
function testGetDataStores() {
|
|
navigator.getDataStores('foo').then(function(stores) {
|
|
is(stores.length, 1, "getDataStores('foo') returns 1 element");
|
|
|
|
gStore = stores[0];
|
|
gRevisions.push(gStore.revisionId);
|
|
|
|
gStore.onchange = function(aEvent) {
|
|
ok(gExpectedEvents, "Events received!");
|
|
runTest();
|
|
}
|
|
|
|
runTest();
|
|
}, cbError);
|
|
}
|
|
|
|
function testBasicInterface() {
|
|
var cursor = gStore.sync();
|
|
ok(cursor, "Cursor is created");
|
|
is(cursor.store, gStore, "Cursor.store is the store");
|
|
|
|
ok("next" in cursor, "Cursor.next exists");
|
|
ok("close" in cursor, "Cursor.close exists");
|
|
|
|
cursor.close();
|
|
|
|
runTest();
|
|
}
|
|
|
|
function testCursor(cursor, steps) {
|
|
if (!steps.length) {
|
|
runTest();
|
|
return;
|
|
}
|
|
|
|
var step = steps.shift();
|
|
cursor.next().then(function(data) {
|
|
ok(!!data, "Cursor.next returns data");
|
|
is(data.operation, step.operation, "Waiting for operation: '" + step.operation + "' received '" + data.operation + "'");
|
|
|
|
|
|
switch (data.operation) {
|
|
case 'clear':
|
|
is (data.id, null, "'clear' operation wants a null id");
|
|
break;
|
|
|
|
case 'done':
|
|
is(/[0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12}/.test(data.revisionId), true, "done has a valid revisionId");
|
|
is (data.revisionId, gRevisions[gRevisions.length-1], "Last revision matches");
|
|
is (data.id, null, "'done' operation wants a null id");
|
|
break;
|
|
|
|
case 'add':
|
|
case 'update':
|
|
if ('id' in step) {
|
|
is(data.id, step.id, "next() add: id matches: " + data.id + " " + step.id);
|
|
}
|
|
|
|
if ('data' in step) {
|
|
is(data.data, step.data, "next() add: data matches: " + data.data + " " + step.data);
|
|
}
|
|
|
|
break;
|
|
|
|
case 'remove':
|
|
if ('id' in step) {
|
|
is(data.id, step.id, "next() add: id matches: " + data.id + " " + step.id);
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
testCursor(cursor, steps);
|
|
});
|
|
}
|
|
|
|
var tests = [
|
|
// Test for GetDataStore
|
|
testGetDataStores,
|
|
|
|
// interface test
|
|
testBasicInterface,
|
|
|
|
// empty DataStore
|
|
function() {
|
|
var cursor = gStore.sync();
|
|
var steps = [ { operation: 'clear' },
|
|
{ operation: 'done' },
|
|
{ operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
function() {
|
|
gExpectedEvents = false;
|
|
var cursor = gStore.sync('wrong revision ID');
|
|
var steps = [ { operation: 'clear' },
|
|
{ operation: 'done' },
|
|
{ operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
function() {
|
|
var cursor = gStore.sync(gRevisions[0]);
|
|
var steps = [ { operation: 'done' },
|
|
{ operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
// Test add from scratch
|
|
function() {
|
|
gExpectedEvents = true;
|
|
|
|
gStore.add(1).then(function(id) {
|
|
gRevisions.push(gStore.revisionId);
|
|
ok(true, "Item: " + id + " added");
|
|
});
|
|
},
|
|
|
|
function() {
|
|
gStore.add(2,"foobar").then(function(id) {
|
|
gRevisions.push(gStore.revisionId);
|
|
ok(true, "Item: " + id + " added");
|
|
});
|
|
},
|
|
|
|
function() {
|
|
gStore.add(3,3).then(function(id) {
|
|
gRevisions.push(gStore.revisionId);
|
|
ok(true, "Item: " + id + " added");
|
|
});
|
|
},
|
|
|
|
function() {
|
|
gExpectedEvents = false;
|
|
var cursor = gStore.sync();
|
|
var steps = [ { operation: 'clear', },
|
|
{ operation: 'add', id: 1, data: 1 },
|
|
{ operation: 'add', id: 3, data: 3 },
|
|
{ operation: 'add', id: 'foobar', data: 2 },
|
|
{ operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
function() {
|
|
var cursor = gStore.sync('wrong revision ID');
|
|
var steps = [ { operation: 'clear', },
|
|
{ operation: 'add', id: 1, data: 1 },
|
|
{ operation: 'add', id: 3, data: 3 },
|
|
{ operation: 'add', id: 'foobar', data: 2 },
|
|
{ operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
function() {
|
|
var cursor = gStore.sync(gRevisions[0]);
|
|
var steps = [ { operation: 'add', id: 1, data: 1 },
|
|
{ operation: 'add', id: 'foobar', data: 2 },
|
|
{ operation: 'add', id: 3, data: 3 },
|
|
{ operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
function() {
|
|
var cursor = gStore.sync(gRevisions[1]);
|
|
var steps = [ { operation: 'add', id: 'foobar', data: 2 },
|
|
{ operation: 'add', id: 3, data: 3 },
|
|
{ operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
function() {
|
|
var cursor = gStore.sync(gRevisions[2]);
|
|
var steps = [ { operation: 'add', id: 3, data: 3 },
|
|
{ operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
function() {
|
|
var cursor = gStore.sync(gRevisions[3]);
|
|
var steps = [ { operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
// Test after an update
|
|
function() {
|
|
gExpectedEvents = true;
|
|
gStore.put(123, 1).then(function() {
|
|
gRevisions.push(gStore.revisionId);
|
|
});
|
|
},
|
|
|
|
function() {
|
|
gExpectedEvents = false;
|
|
var cursor = gStore.sync();
|
|
var steps = [ { operation: 'clear', },
|
|
{ operation: 'add', id: 1, data: 123 },
|
|
{ operation: 'add', id: 3, data: 3 },
|
|
{ operation: 'add', id: 'foobar', data: 2 },
|
|
{ operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
function() {
|
|
var cursor = gStore.sync('wrong revision ID');
|
|
var steps = [ { operation: 'clear', },
|
|
{ operation: 'add', id: 1, data: 123 },
|
|
{ operation: 'add', id: 3, data: 3 },
|
|
{ operation: 'add', id: 'foobar', data: 2 },
|
|
{ operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
function() {
|
|
var cursor = gStore.sync(gRevisions[0]);
|
|
var steps = [ { operation: 'add', id: 1, data: 123 },
|
|
{ operation: 'add', id: 'foobar', data: 2 },
|
|
{ operation: 'add', id: 3, data: 3 },
|
|
{ operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
function() {
|
|
var cursor = gStore.sync(gRevisions[1]);
|
|
var steps = [ { operation: 'add', id: 'foobar', data: 2 },
|
|
{ operation: 'add', id: 3, data: 3 },
|
|
{ operation: 'update', id: 1, data: 123 },
|
|
{ operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
function() {
|
|
var cursor = gStore.sync(gRevisions[2]);
|
|
var steps = [ { operation: 'add', id: 3, data: 3 },
|
|
{ operation: 'update', id: 1, data: 123 },
|
|
{ operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
function() {
|
|
var cursor = gStore.sync(gRevisions[3]);
|
|
var steps = [ { operation: 'update', id: 1, data: 123 },
|
|
{ operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
function() {
|
|
var cursor = gStore.sync(gRevisions[4]);
|
|
var steps = [ { operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
// Test after a remove
|
|
function() {
|
|
gExpectedEvents = true;
|
|
gStore.remove(3).then(function() {
|
|
gRevisions.push(gStore.revisionId);
|
|
});
|
|
},
|
|
|
|
function() {
|
|
gExpectedEvents = false;
|
|
var cursor = gStore.sync();
|
|
var steps = [ { operation: 'clear', },
|
|
{ operation: 'add', id: 1, data: 123 },
|
|
{ operation: 'add', id: 'foobar', data: 2 },
|
|
{ operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
function() {
|
|
var cursor = gStore.sync('wrong revision ID');
|
|
var steps = [ { operation: 'clear', },
|
|
{ operation: 'add', id: 1, data: 123 },
|
|
{ operation: 'add', id: 'foobar', data: 2 },
|
|
{ operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
function() {
|
|
var cursor = gStore.sync(gRevisions[0]);
|
|
var steps = [ { operation: 'add', id: 1, data: 123 },
|
|
{ operation: 'add', id: 'foobar', data: 2 },
|
|
{ operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
function() {
|
|
var cursor = gStore.sync(gRevisions[1]);
|
|
var steps = [ { operation: 'add', id: 'foobar', data: 2 },
|
|
{ operation: 'update', id: 1, data: 123 },
|
|
{ operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
function() {
|
|
var cursor = gStore.sync(gRevisions[2]);
|
|
var steps = [ { operation: 'update', id: 1, data: 123 },
|
|
{ operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
function() {
|
|
var cursor = gStore.sync(gRevisions[3]);
|
|
var steps = [ { operation: 'update', id: 1, data: 123 },
|
|
{ operation: 'remove', id: 3 },
|
|
{ operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
function() {
|
|
var cursor = gStore.sync(gRevisions[4]);
|
|
var steps = [ { operation: 'remove', id: 3 },
|
|
{ operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
function() {
|
|
var cursor = gStore.sync(gRevisions[5]);
|
|
var steps = [ { operation: 'done' }];
|
|
testCursor(cursor, steps);
|
|
},
|
|
|
|
// New events when the cursor is active
|
|
function() {
|
|
gCursor = gStore.sync();
|
|
var steps = [ { operation: 'clear', },
|
|
{ operation: 'add', id: 1, data: 123 },
|
|
{ operation: 'add', id: 'foobar', data: 2 } ];
|
|
testCursor(gCursor, steps);
|
|
},
|
|
|
|
function() {
|
|
gStore.add(42, 2).then(function(id) {
|
|
ok(true, "Item: " + id + " added");
|
|
gRevisions.push(gStore.revisionId);
|
|
runTest();
|
|
});
|
|
},
|
|
|
|
function() {
|
|
var steps = [ { operation: 'clear', },
|
|
{ operation: 'add', id: 1, data: 123 },
|
|
{ operation: 'add', id: 2, data: 42 },
|
|
{ operation: 'add', id: 'foobar', data: 2 } ]
|
|
testCursor(gCursor, steps);
|
|
},
|
|
|
|
function() {
|
|
gStore.put(43, 2).then(function(id) {
|
|
gRevisions.push(gStore.revisionId);
|
|
runTest();
|
|
});
|
|
},
|
|
|
|
function() {
|
|
var steps = [ { operation: 'clear', },
|
|
{ operation: 'add', id: 1, data: 123 },
|
|
{ operation: 'add', id: 2, data: 43 },
|
|
{ operation: 'add', id: 'foobar', data: 2 } ]
|
|
testCursor(gCursor, steps);
|
|
},
|
|
|
|
function() {
|
|
gStore.remove(2).then(function(id) {
|
|
gRevisions.push(gStore.revisionId);
|
|
runTest();
|
|
});
|
|
},
|
|
|
|
function() {
|
|
var steps = [ { operation: 'clear', },
|
|
{ operation: 'add', id: 1, data: 123 },
|
|
{ operation: 'add', id: 'foobar', data: 2 } ]
|
|
testCursor(gCursor, steps);
|
|
},
|
|
|
|
function() {
|
|
gStore.add(42).then(function(id) {
|
|
ok(true, "Item: " + id + " added");
|
|
gRevisions.push(gStore.revisionId);
|
|
runTest();
|
|
});
|
|
},
|
|
|
|
function() {
|
|
var steps = [ { operation: 'clear', },
|
|
{ operation: 'add', id: 1, data: 123 },
|
|
{ operation: 'add', id: 4, data: 42 },
|
|
{ operation: 'add', id: 'foobar', data: 2 } ]
|
|
testCursor(gCursor, steps);
|
|
},
|
|
|
|
function() {
|
|
gStore.clear().then(function() {
|
|
gRevisions.push(gStore.revisionId);
|
|
runTest();
|
|
});
|
|
},
|
|
|
|
function() {
|
|
var steps = [ { operation: 'clear' } ];
|
|
testCursor(gCursor, steps);
|
|
},
|
|
|
|
function() {
|
|
gStore.add(42).then(function(id) {
|
|
ok(true, "Item: " + id + " added");
|
|
gRevisions.push(gStore.revisionId);
|
|
runTest();
|
|
});
|
|
},
|
|
|
|
function() {
|
|
var steps = [ { operation: 'clear', },
|
|
{ operation: 'add', id: 5, data: 42 } ];
|
|
testCursor(gCursor, steps);
|
|
},
|
|
|
|
function() {
|
|
gStore.clear().then(function() {
|
|
gRevisions.push(gStore.revisionId);
|
|
runTest();
|
|
});
|
|
},
|
|
|
|
function() {
|
|
gStore.add(42).then(function(id) {
|
|
ok(true, "Item: " + id + " added");
|
|
gRevisions.push(gStore.revisionId);
|
|
runTest();
|
|
});
|
|
},
|
|
|
|
function() {
|
|
var steps = [ { operation: 'clear' },
|
|
{ operation: 'add', id: 6, data: 42 },
|
|
{ operation: 'done'} ];
|
|
testCursor(gCursor, steps);
|
|
},
|
|
|
|
function() {
|
|
gExpectedEvents = true;
|
|
gStore.add(42).then(function(id) {
|
|
});
|
|
}
|
|
];
|
|
|
|
function runTest() {
|
|
if (!tests.length) {
|
|
finish();
|
|
return;
|
|
}
|
|
|
|
var test = tests.shift();
|
|
test();
|
|
}
|