Index: test/codegen/lib/html/indexeddb_4_test.dart |
diff --git a/test/codegen/lib/html/indexeddb_4_test.dart b/test/codegen/lib/html/indexeddb_4_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..37613015b2c0c71c2b1f1cb77fa9af5e956b60c1 |
--- /dev/null |
+++ b/test/codegen/lib/html/indexeddb_4_test.dart |
@@ -0,0 +1,131 @@ |
+library IndexedDB4Test; |
+import 'package:unittest/unittest.dart'; |
+import 'package:unittest/html_config.dart'; |
+import 'dart:async'; |
+import 'dart:html' as html; |
+import 'dart:indexed_db'; |
+ |
+// Test for KeyRange and Cursor. |
+ |
+const String DB_NAME = 'Test4'; |
+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'); |
+ return transaction.objectStore(STORE_NAME).put( |
+ {'content': 'Item $index'}, index); |
+ } |
+ |
+ 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); |
+} |
+ |
+testRange(db, range, expectedFirst, expectedLast) { |
+ Transaction txn = db.transaction(STORE_NAME, 'readonly'); |
+ ObjectStore objectStore = txn.objectStore(STORE_NAME); |
+ var cursors = objectStore.openCursor(range: range, autoAdvance: true) |
+ .asBroadcastStream(); |
+ |
+ int lastKey; |
+ cursors.listen((cursor) { |
+ lastKey = cursor.key; |
+ var value = cursor.value; |
+ expect(value['content'], 'Item ${cursor.key}'); |
+ }); |
+ |
+ if (expectedFirst != null) { |
+ cursors.first.then((cursor) { |
+ expect(cursor.key, expectedFirst); |
+ }); |
+ } |
+ if (expectedLast != null) { |
+ cursors.last.then((cursor) { |
+ expect(lastKey, expectedLast); |
+ }); |
+ } |
+ |
+ return cursors.length.then((length) { |
+ if (expectedFirst == null) { |
+ expect(length, isZero); |
+ } else { |
+ expect(length, expectedLast - expectedFirst + 1); |
+ } |
+ }); |
+} |
+ |
+main() { |
+ useHtmlConfiguration(); |
+ |
+ // Don't bother with these tests if it's unsupported. |
+ // Support is tested in indexeddb_1_test |
+ if (IdbFactory.supported) { |
+ var db; |
+ setUp(() { |
+ if (db == null) { |
+ return setupDb().then((result) { |
+ db = result; |
+ }); |
+ } |
+ }); |
+ test('only1', () => testRange(db, new KeyRange.only(55), 55, 55)); |
+ test('only2', () => testRange(db, new KeyRange.only(100), null, null)); |
+ test('only3', () => testRange(db, new KeyRange.only(-1), null, null)); |
+ |
+ test('lower1', () => |
+ testRange(db, new KeyRange.lowerBound(40), 40, 99)); |
+ // OPTIONALS lower2() => testRange(db, new KeyRange.lowerBound(40, open: true), 41, 99); |
+ test('lower2', () => |
+ testRange(db, new KeyRange.lowerBound(40, true), 41, 99)); |
+ // OPTIONALS lower3() => testRange(db, new KeyRange.lowerBound(40, open: false), 40, 99); |
+ test('lower3', () => |
+ testRange(db, new KeyRange.lowerBound(40, false), 40, 99)); |
+ |
+ test('upper1', () => |
+ testRange(db, new KeyRange.upperBound(40), 0, 40)); |
+ // OPTIONALS upper2() => testRange(db, new KeyRange.upperBound(40, open: true), 0, 39); |
+ test('upper2', () => |
+ testRange(db, new KeyRange.upperBound(40, true), 0, 39)); |
+ // upper3() => testRange(db, new KeyRange.upperBound(40, open: false), 0, 40); |
+ test('upper3', () => |
+ testRange(db, new KeyRange.upperBound(40, false), 0, 40)); |
+ |
+ test('bound1', () => |
+ testRange(db, new KeyRange.bound(20, 30), 20, 30)); |
+ |
+ test('bound2', () => |
+ testRange(db, new KeyRange.bound(-100, 200), 0, 99)); |
+ |
+ bound3() => |
+ // OPTIONALS testRange(db, new KeyRange.bound(20, 30, upperOpen: true), |
+ testRange(db, new KeyRange.bound(20, 30, false, true), 20, 29); |
+ |
+ bound4() => |
+ // OPTIONALS testRange(db, new KeyRange.bound(20, 30, lowerOpen: true), |
+ testRange(db, new KeyRange.bound(20, 30, true), 21, 30); |
+ |
+ bound5() => |
+ // OPTIONALS testRange(db, new KeyRange.bound(20, 30, lowerOpen: true, upperOpen: true), |
+ testRange(db, new KeyRange.bound(20, 30, true, true), 21, 29); |
+ } |
+} |