| Index: test/codegen/lib/html/indexeddb_3_test.dart
|
| diff --git a/test/codegen/lib/html/indexeddb_3_test.dart b/test/codegen/lib/html/indexeddb_3_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c5034c45f394b4b95573c86af3fc1a9d9108a91d
|
| --- /dev/null
|
| +++ b/test/codegen/lib/html/indexeddb_3_test.dart
|
| @@ -0,0 +1,114 @@
|
| +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);
|
| + });
|
| + }
|
| +}
|
|
|