text: 'use strict';
  
  describe('IndexedDB', ifEnvSupports('IDBDatabase', function () {
    var testZone = zone.fork();
    var db;
  
    beforeEach(function (done) {
      var openRequest = indexedDB.open('_zone_testdb');
      openRequest.onupgradeneeded = function(event) {
        db = event.target.result;
        var objectStore = db.createObjectStore('test-object-store', {
          keyPath: 'key'
        });
        objectStore.createIndex('key', 'key', { unique: true });
        objectStore.createIndex('data', 'data', { unique: false });
  
        objectStore.transaction.oncomplete = function() {
          var testStore = db.transaction('test-object-store', 'readwrite').objectStore('test-object-store');
          testStore.add({
            key: 1,
            data: 'Test data'
          });
          testStore.transaction.oncomplete = function() {
            done();
          }
        };
      };
    });
  
    afterEach(function(done) {
      db.close();
  
      var openRequest = indexedDB.deleteDatabase('_zone_testdb');
      openRequest.onsuccess = function(event) {
        done();
      };
    });
  
    describe('IDBRequest', function() {
      it('should bind EventTarget.addEventListener', function (done) {
        testZone.run(function () {
          db.transaction('test-object-store').objectStore('test-object-store').get(1).addEventListener('success', function(event) {
            expect(zone).toBeDirectChildOf(testZone);
            expect(event.target.result.data).toBe('Test data');
            done();
          });
        });
      });
  
      it('should bind onEventType listeners', function (done) {
        testZone.run(function () {
          db.transaction('test-object-store').objectStore('test-object-store').get(1).onsuccess = function(event) {
            expect(zone).toBeDirectChildOf(testZone);
            expect(event.target.result.data).toBe('Test data');
            done();
          };
        });
      });
    });
  
    describe('IDBCursor', function() {
      it('should bind EventTarget.addEventListener', function (done) {
        testZone.run(function () {
          db.transaction('test-object-store').objectStore('test-object-store').openCursor().addEventListener('success', function(event) {
            var cursor = event.target.result;
            if (cursor) {
              expect(zone).toBeDirectChildOf(testZone);
              expect(cursor.value.data).toBe('Test data');
              done();
            } else {
              throw 'Error while reading cursor!';
            }
          });
        });
      });
  
      it('should bind onEventType listeners', function (done) {
        testZone.run(function () {
          db.transaction('test-object-store').objectStore('test-object-store').openCursor().onsuccess = function(event) {
            var cursor = event.target.result;
            if (cursor) {
              expect(zone).toBeDirectChildOf(testZone);
              expect(cursor.value.data).toBe('Test data');
              done();
            } else {
              throw 'Error while reading cursor!';
            }
          };
        });
      });
    });
  
    describe('IDBIndex', function() {
      it('should bind EventTarget.addEventListener', function (done) {
        testZone.run(function () {
          db.transaction('test-object-store').objectStore('test-object-store').index('data').get('Test data').addEventListener('success', function(event) {
            expect(zone).toBeDirectChildOf(testZone);
            expect(event.target.result.key).toBe(1);
            done();
          });
        });
      });
  
      it('should bind onEventType listeners', function (done) {
        testZone.run(function () {
          db.transaction('test-object-store').objectStore('test-object-store').index('data').get('Test data').onsuccess = function(event) {
            expect(zone).toBeDirectChildOf(testZone);
            expect(event.target.result.key).toBe(1);
            done();
          };
        });
      });
    });
  }));