blob: 50a4d85ea652a2ba3958503c6e536eb7db01c89c [file] [log] [blame]
library IndexedDB3Test;
import 'package:unittest/unittest.dart';
import 'package:unittest/html_config.dart';
import 'dart:async';
import 'dart:html' as html;
import 'dart:indexed_db';
// Read with cursor.
const String DB_NAME = 'Test3';
const String STORE_NAME = 'TEST';
const int VERSION = 1;
Future<Database> createAndOpenDb() {
return html.window.indexedDB.deleteDatabase(DB_NAME).then((_) {
return html.window.indexedDB.open(DB_NAME, version: VERSION,
onUpgradeNeeded: (e) {
var db = e.target.result;
db.createObjectStore(STORE_NAME);
});
});
}
Future<Database> writeItems(Database db) {
Future<Object> write(index) {
var transaction = db.transaction(STORE_NAME, 'readwrite');
transaction.objectStore(STORE_NAME).put('Item $index', index);
return transaction.completed;
}
var future = write(0);
for (var i = 1; i < 100; ++i) {
future = future.then((_) => write(i));
}
// Chain on the DB so we return it at the end.
return future.then((_) => db);
}
Future<Database> setupDb() {
return createAndOpenDb().then(writeItems);
}
Future<Database> readAllViaCursor(Database db) {
Transaction txn = db.transaction(STORE_NAME, 'readonly');
ObjectStore objectStore = txn.objectStore(STORE_NAME);
int itemCount = 0;
int sumKeys = 0;
var lastKey = null;
var cursors = objectStore.openCursor().asBroadcastStream();
cursors.listen((cursor) {
++itemCount;
lastKey = cursor.key;
sumKeys += cursor.key;
expect(cursor.value, 'Item ${cursor.key}');
cursor.next();
});
cursors.last.then((cursor) {
expect(lastKey, 99);
expect(sumKeys, (100 * 99) ~/ 2);
expect(itemCount, 100);
});
return cursors.last.then((_) => db);
}
Future<Database> readAllReversedViaCursor(Database db) {
Transaction txn = db.transaction(STORE_NAME, 'readonly');
ObjectStore objectStore = txn.objectStore(STORE_NAME);
int itemCount = 0;
int sumKeys = 0;
var lastKey = null;
var cursors = objectStore.openCursor(direction: 'prev').asBroadcastStream();
cursors.listen((cursor) {
++itemCount;
lastKey = cursor.key;
sumKeys += cursor.key;
expect(cursor.value, 'Item ${cursor.key}');
cursor.next();
});
cursors.last.then((cursor) {
expect(lastKey, 0);
expect(sumKeys, (100 * 99) ~/ 2);
expect(itemCount, 100);
});
return cursors.last.then((_) => db);
}
main() {
useHtmlConfiguration();
// Don't bother with these tests if it's unsupported.
// Support is tested in indexeddb_1_test
if (IdbFactory.supported) {
var db;
test('prepare', () {
return setupDb().then((result) {
db = result;
});
});
test('readAll1', () {
return readAllViaCursor(db);
});
test('readAll2', () {
return readAllReversedViaCursor(db);
});
}
}