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); |
+ }); |
+ } |
+} |