| Index: test/codegen/lib/html/indexeddb_1_test.dart
|
| diff --git a/test/codegen/lib/html/indexeddb_1_test.dart b/test/codegen/lib/html/indexeddb_1_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f4422de591b25275be47fb02613a120eb971d44d
|
| --- /dev/null
|
| +++ b/test/codegen/lib/html/indexeddb_1_test.dart
|
| @@ -0,0 +1,179 @@
|
| +library IndexedDB1Test;
|
| +import 'package:unittest/unittest.dart';
|
| +import 'package:unittest/html_individual_config.dart';
|
| +import 'dart:async';
|
| +import 'dart:html' as html;
|
| +import 'dart:math' as math;
|
| +import 'dart:indexed_db' as idb;
|
| +
|
| +const String STORE_NAME = 'TEST';
|
| +const int VERSION = 1;
|
| +
|
| +var databaseNameIndex = 0;
|
| +String nextDatabaseName() {
|
| + return 'Test1_${databaseNameIndex++}';
|
| +}
|
| +
|
| +Future testUpgrade() {
|
| + var dbName = nextDatabaseName();
|
| + var upgraded = false;
|
| +
|
| + // Delete any existing DBs.
|
| + return html.window.indexedDB.deleteDatabase(dbName).then((_) {
|
| +
|
| + return html.window.indexedDB.open(dbName, version: 1,
|
| + onUpgradeNeeded: (e) {});
|
| + }).then((db) {
|
| + db.close();
|
| + }).then((_) {
|
| + return html.window.indexedDB.open(dbName, version: 2,
|
| + onUpgradeNeeded: (e) {
|
| + expect(e.oldVersion, 1);
|
| + expect(e.newVersion, 2);
|
| + upgraded = true;
|
| + });
|
| + }).then((_) {
|
| + expect(upgraded, isTrue);
|
| + });
|
| +}
|
| +
|
| +testReadWrite(key, value, matcher,
|
| + [dbName, storeName = STORE_NAME, version = VERSION,
|
| + stringifyResult = false]) => () {
|
| + if (dbName == null) {
|
| + dbName = nextDatabaseName();
|
| + }
|
| + createObjectStore(e) {
|
| + var store = e.target.result.createObjectStore(storeName);
|
| + expect(store, isNotNull);
|
| + }
|
| +
|
| + var db;
|
| + return html.window.indexedDB.deleteDatabase(dbName).then((_) {
|
| + return html.window.indexedDB.open(dbName, version: version,
|
| + onUpgradeNeeded: createObjectStore);
|
| + }).then((result) {
|
| + db = result;
|
| + var transaction = db.transactionList([storeName], 'readwrite');
|
| + transaction.objectStore(storeName).put(value, key);
|
| + return transaction.completed;
|
| + }).then((_) {
|
| + var transaction = db.transaction(storeName, 'readonly');
|
| + return transaction.objectStore(storeName).getObject(key);
|
| + }).then((object) {
|
| + db.close();
|
| + if (stringifyResult) {
|
| + // Stringify the numbers to verify that we're correctly returning ints
|
| + // as ints vs doubles.
|
| + expect(object.toString(), matcher);
|
| + } else {
|
| + expect(object, matcher);
|
| + }
|
| + }).whenComplete(() {
|
| + if (db != null) {
|
| + db.close();
|
| + }
|
| + return html.window.indexedDB.deleteDatabase(dbName);
|
| + });
|
| +};
|
| +
|
| +testReadWriteTyped(key, value, matcher,
|
| + [dbName, storeName = STORE_NAME, version = VERSION,
|
| + stringifyResult = false]) => () {
|
| + if (dbName == null) {
|
| + dbName = nextDatabaseName();
|
| + }
|
| + void createObjectStore(e) {
|
| + var store = e.target.result.createObjectStore(storeName);
|
| + expect(store, isNotNull);
|
| + }
|
| +
|
| + idb.Database db;
|
| + // Delete any existing DBs.
|
| + return html.window.indexedDB.deleteDatabase(dbName).then((_) {
|
| + return html.window.indexedDB.open(dbName, version: version,
|
| + onUpgradeNeeded: createObjectStore);
|
| + }).then((idb.Database result) {
|
| + db = result;
|
| + idb.Transaction transaction = db.transactionList([storeName], 'readwrite');
|
| + transaction.objectStore(storeName).put(value, key);
|
| +
|
| + return transaction.completed;
|
| + }).then((idb.Database result) {
|
| + idb.Transaction transaction = db.transaction(storeName, 'readonly');
|
| + return transaction.objectStore(storeName).getObject(key);
|
| + }).then((object) {
|
| + db.close();
|
| + if (stringifyResult) {
|
| + // Stringify the numbers to verify that we're correctly returning ints
|
| + // as ints vs doubles.
|
| + expect(object.toString(), matcher);
|
| + } else {
|
| + expect(object, matcher);
|
| + }
|
| + }).whenComplete(() {
|
| + if (db != null) {
|
| + db.close();
|
| + }
|
| + return html.window.indexedDB.deleteDatabase(dbName);
|
| + });
|
| +};
|
| +
|
| +void testTypes(testFunction) {
|
| + test('String', testFunction(123, 'Hoot!', equals('Hoot!')));
|
| + test('int', testFunction(123, 12345, equals(12345)));
|
| + test('List', testFunction(123, [1, 2, 3], equals([1, 2, 3])));
|
| + test('List 2', testFunction(123, [2, 3, 4], equals([2, 3, 4])));
|
| + test('bool', testFunction(123, [true, false], equals([true, false])));
|
| + test('largeInt', testFunction(123, 1371854424211,
|
| + equals("1371854424211"), null, STORE_NAME, VERSION, true));
|
| + test('largeDoubleConvertedToInt', testFunction(123, 1371854424211.0,
|
| + equals("1371854424211"), null, STORE_NAME, VERSION, true));
|
| + test('largeIntInMap', testFunction(123, {'time': 4503599627370492},
|
| + equals("{time: 4503599627370492}"), null, STORE_NAME, VERSION, true));
|
| + var now = new DateTime.now();
|
| + test('DateTime', testFunction(123, now,
|
| + predicate((date) =>
|
| + date.millisecondsSinceEpoch == now.millisecondsSinceEpoch)));
|
| +}
|
| +
|
| +main() {
|
| + useHtmlIndividualConfiguration();
|
| +
|
| + // Test that indexed_db is properly flagged as supported or not.
|
| + // Note that the rest of the indexed_db tests assume that this has been
|
| + // checked.
|
| + group('supported', () {
|
| + test('supported', () {
|
| + expect(idb.IdbFactory.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supportsDatabaseNames', () {
|
| + test('supported', () {
|
| + expect(html.window.indexedDB.supportsDatabaseNames, isTrue);
|
| + });
|
| + });
|
| +
|
| + group('functional', () {
|
| + test('throws when unsupported', () {
|
| + var expectation = idb.IdbFactory.supported ? returnsNormally : throws;
|
| +
|
| + expect(() {
|
| + var db = html.window.indexedDB;
|
| + db.open('random_db');
|
| + }, expectation);
|
| + });
|
| +
|
| + // Don't bother with these tests if it's unsupported.
|
| + if (idb.IdbFactory.supported) {
|
| + test('upgrade', testUpgrade);
|
| + group('dynamic', () {
|
| + testTypes(testReadWrite);
|
| + });
|
| + group('typed', () {
|
| + testTypes(testReadWriteTyped);
|
| + });
|
| + }
|
| + });
|
| +}
|
|
|