text: /**
   * @license
   * Copyright Google Inc. All Rights Reserved.
   *
   * Use of this source code is governed by an MIT-style license that can be
   * found in the LICENSE file at https://angular.io/license
   */
  'use strict';
  (function () {
      var __extends = function (d, b) {
          for (var p in b)
              if (b.hasOwnProperty(p))
                  d[p] = b[p];
          function __() {
              this.constructor = d;
          }
          d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
      };
      // Patch jasmine's describe/it/beforeEach/afterEach functions so test code always runs
      // in a testZone (ProxyZone). (See: angular/zone.js#91 & angular/angular#10503)
      if (!Zone)
          throw new Error('Missing: zone.js');
      if (typeof jasmine == 'undefined')
          throw new Error('Missing: jasmine.js');
      if (jasmine['__zone_patch__'])
          throw new Error('\'jasmine\' has already been patched with \'Zone\'.');
      jasmine['__zone_patch__'] = true;
      var SyncTestZoneSpec = Zone['SyncTestZoneSpec'];
      var ProxyZoneSpec = Zone['ProxyZoneSpec'];
      if (!SyncTestZoneSpec)
          throw new Error('Missing: SyncTestZoneSpec');
      if (!ProxyZoneSpec)
          throw new Error('Missing: ProxyZoneSpec');
      var ambientZone = Zone.current;
      // Create a synchronous-only zone in which to run `describe` blocks in order to raise an
      // error if any asynchronous operations are attempted inside of a `describe` but outside of
      // a `beforeEach` or `it`.
      var syncZone = ambientZone.fork(new SyncTestZoneSpec('jasmine.describe'));
      // This is the zone which will be used for running individual tests.
      // It will be a proxy zone, so that the tests function can retroactively install
      // different zones.
      // Example:
      //   - In beforeEach() do childZone = Zone.current.fork(...);
      //   - In it() try to do fakeAsync(). The issue is that because the beforeEach forked the
      //     zone outside of fakeAsync it will be able to escope the fakeAsync rules.
      //   - Because ProxyZone is parent fo `childZone` fakeAsync can retroactively add
      //     fakeAsync behavior to the childZone.
      var testProxyZone = null;
      // Monkey patch all of the jasmine DSL so that each function runs in appropriate zone.
      var jasmineEnv = jasmine.getEnv();
      ['describe', 'xdescribe', 'fdescribe'].forEach(function (methodName) {
          var originalJasmineFn = jasmineEnv[methodName];
          jasmineEnv[methodName] = function (description, specDefinitions) {
              return originalJasmineFn.call(this, description, wrapDescribeInZone(specDefinitions));
          };
      });
      ['it', 'xit', 'fit'].forEach(function (methodName) {
          var originalJasmineFn = jasmineEnv[methodName];
          jasmineEnv[methodName] = function (description, specDefinitions, timeout) {
              arguments[1] = wrapTestInZone(specDefinitions);
              return originalJasmineFn.apply(this, arguments);
          };
      });
      ['beforeEach', 'afterEach'].forEach(function (methodName) {
          var originalJasmineFn = jasmineEnv[methodName];
          jasmineEnv[methodName] = function (specDefinitions, timeout) {
              arguments[0] = wrapTestInZone(specDefinitions);
              return originalJasmineFn.apply(this, arguments);
          };
      });
      /**
       * Gets a function wrapping the body of a Jasmine `describe` block to execute in a
       * synchronous-only zone.
       */
      function wrapDescribeInZone(describeBody) {
          return function () {
              return syncZone.run(describeBody, this, arguments);
          };
      }
      /**
       * Gets a function wrapping the body of a Jasmine `it/beforeEach/afterEach` block to
       * execute in a ProxyZone zone.
       * This will run in `testProxyZone`. The `testProxyZone` will be reset by the `ZoneQueueRunner`
       */
      function wrapTestInZone(testBody) {
          // The `done` callback is only passed through if the function expects at least one argument.
          // Note we have to make a function with correct number of arguments, otherwise jasmine will
          // think that all functions are sync or async.
          return (testBody.length == 0) ? function () {
              return testProxyZone.run(testBody, this);
          } : function (done) {
              return testProxyZone.run(testBody, this, [done]);
          };
      }
      var QueueRunner = jasmine.QueueRunner;
      jasmine.QueueRunner = (function (_super) {
          __extends(ZoneQueueRunner, _super);
          function ZoneQueueRunner(attrs) {
              attrs.onComplete = (function (fn) { return function () {
                  // All functions are done, clear the test zone.
                  testProxyZone = null;
                  ambientZone.scheduleMicroTask('jasmine.onComplete', fn);
              }; })(attrs.onComplete);
              _super.call(this, attrs);
          }
          ZoneQueueRunner.prototype.execute = function () {
              var _this = this;
              if (Zone.current !== ambientZone)
                  throw new Error('Unexpected Zone: ' + Zone.current.name);
              testProxyZone = ambientZone.fork(new ProxyZoneSpec());
              if (!Zone.currentTask) {
                  // if we are not running in a task then if someone would register a
                  // element.addEventListener and then calling element.click() the
                  // addEventListener callback would think that it is the top most task and would
                  // drain the microtask queue on element.click() which would be incorrect.
                  // For this reason we always force a task when running jasmine tests.
                  Zone.current.scheduleMicroTask('jasmine.execute().forceTask', function () { return QueueRunner.prototype.execute.call(_this); });
              }
              else {
                  _super.prototype.execute.call(this);
              }
          };
          return ZoneQueueRunner;
      }(QueueRunner));
  })();
  //# sourceMappingURL=jasmine.js.map