blob: 4c55d979e4bff2cebd4818f25db54e5c298b30e6 [file] [log] [blame]
library IndexedDB3Test;
import '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/html_config.dart';
import 'dart:html';
// Read with cursor.
const String DB_NAME = 'Test';
const String STORE_NAME = 'TEST';
const int VERSION = 1;
class Test {
fail(message) => (e) {
guardAsync(() {
expect(false, isTrue, reason: 'IndexedDB failure: $message');
});
};
_createObjectStore(db) {
try {
// Nuke object store if it already exists.
db.deleteObjectStore(STORE_NAME);
}
on IDBDatabaseException catch(e) { } // Chrome
on DOMException catch(e) { } // Firefox
db.createObjectStore(STORE_NAME);
}
var db;
_openDb(afterOpen()) {
var request = window.indexedDB.open(DB_NAME, VERSION);
if (request is IDBOpenDBRequest) {
// New upgrade protocol. FireFox 15, Chrome 24, hopefully IE10.
request.on.success.add(expectAsync1((e) {
db = e.target.result;
afterOpen();
}));
request.on.upgradeNeeded.add((e) {
guardAsync(() {
_createObjectStore(e.target.result);
});
});
request.on.error.add(fail('open'));
} else {
// Legacy setVersion upgrade protocol. Chrome < 23.
request.on.success.add(expectAsync1((e) {
db = e.target.result;
if (db.version != '$VERSION') {
var setRequest = db.setVersion('$VERSION');
setRequest.on.success.add(
expectAsync1((e) {
_createObjectStore(db);
var transaction = e.target.result;
transaction.on.complete.add(
expectAsync1((e) => afterOpen()));
transaction.on.error.add(fail('Upgrade'));
}));
setRequest.on.error.add(fail('setVersion error'));
} else {
afterOpen();
}
}));
request.on.error.add(fail('open'));
}
}
_createAndOpenDb(afterOpen()) {
var request = window.indexedDB.deleteDatabase(DB_NAME);
request.on.success.add(expectAsync1((e) { _openDb(afterOpen); }));
request.on.error.add(fail('delete old Db'));
}
writeItems(int index) {
if (index < 100) {
var transaction = db.transaction([STORE_NAME], 'readwrite');
var request = transaction.objectStore(STORE_NAME)
.put('Item $index', index);
request.on.success.add(expectAsync1((e) {
writeItems(index + 1);
}
));
request.on.error.add(fail('put'));
}
}
setupDb() { _createAndOpenDb(() => writeItems(0)); }
readAllViaCursor() {
IDBTransaction txn = db.transaction(STORE_NAME, 'readonly');
IDBObjectStore objectStore = txn.objectStore(STORE_NAME);
IDBRequest cursorRequest = objectStore.openCursor();
int itemCount = 0;
int sumKeys = 0;
int lastKey = null;
cursorRequest.on.success.add(expectAsync1((e) {
var cursor = e.target.result;
if (cursor != null) {
lastKey = cursor.key;
itemCount += 1;
sumKeys += cursor.key;
window.console.log('${cursor.key} ${cursor.value}');
expect(cursor.value, 'Item ${cursor.key}');
cursor.continueFunction();
} else {
// Done
expect(lastKey, 99);
expect(itemCount, 100);
expect(sumKeys, (100 * 99) ~/ 2);
}
}, count:101));
cursorRequest.on.error.add(fail('openCursor'));
}
readAllReversedViaCursor() {
IDBTransaction txn = db.transaction(STORE_NAME, 'readonly');
IDBObjectStore objectStore = txn.objectStore(STORE_NAME);
// TODO: create a IDBKeyRange(0,100)
IDBRequest cursorRequest = objectStore.openCursor(null, 'prev');
int itemCount = 0;
int sumKeys = 0;
int lastKey = null;
cursorRequest.on.success.add(expectAsync1((e) {
var cursor = e.target.result;
if (cursor != null) {
lastKey = cursor.key;
itemCount += 1;
sumKeys += cursor.key;
expect(cursor.value, 'Item ${cursor.key}');
cursor.continueFunction();
} else {
// Done
expect(lastKey, 0); // i.e. first key (scanned in reverse).
expect(itemCount, 100);
expect(sumKeys, (100 * 99) ~/ 2);
}
}, count:101));
cursorRequest.on.error.add(fail('openCursor'));
}
}
main() {
useHtmlConfiguration();
var test_ = new Test();
test('prepare', test_.setupDb);
test('readAll1', test_.readAllViaCursor);
test('readAll2', test_.readAllReversedViaCursor);
}