text: 'use strict';
  
  var path = _interopRequireWildcard(require('path'));
  
  var _sourceMap = require('@jest/source-map');
  
  var _each = _interopRequireDefault(require('./each'));
  
  var _errorOnPrivate = require('./errorOnPrivate');
  
  var _reporter = _interopRequireDefault(require('./reporter'));
  
  var _jasmineAsyncInstall = _interopRequireDefault(
    require('./jasmineAsyncInstall')
  );
  
  function _interopRequireDefault(obj) {
    return obj && obj.__esModule ? obj : {default: obj};
  }
  
  function _getRequireWildcardCache() {
    if (typeof WeakMap !== 'function') return null;
    var cache = new WeakMap();
    _getRequireWildcardCache = function () {
      return cache;
    };
    return cache;
  }
  
  function _interopRequireWildcard(obj) {
    if (obj && obj.__esModule) {
      return obj;
    }
    if (obj === null || (typeof obj !== 'object' && typeof obj !== 'function')) {
      return {default: obj};
    }
    var cache = _getRequireWildcardCache();
    if (cache && cache.has(obj)) {
      return cache.get(obj);
    }
    var newObj = {};
    var hasPropertyDescriptor =
      Object.defineProperty && Object.getOwnPropertyDescriptor;
    for (var key in obj) {
      if (Object.prototype.hasOwnProperty.call(obj, key)) {
        var desc = hasPropertyDescriptor
          ? Object.getOwnPropertyDescriptor(obj, key)
          : null;
        if (desc && (desc.get || desc.set)) {
          Object.defineProperty(newObj, key, desc);
        } else {
          newObj[key] = obj[key];
        }
      }
    }
    newObj.default = obj;
    if (cache) {
      cache.set(obj, newObj);
    }
    return newObj;
  }
  
  /**
   * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
   *
   * This source code is licensed under the MIT license found in the
   * LICENSE file in the root directory of this source tree.
   */
  const JASMINE = require.resolve('./jasmine/jasmineLight');
  
  async function jasmine2(globalConfig, config, environment, runtime, testPath) {
    const reporter = new _reporter.default(globalConfig, config, testPath);
    const jasmineFactory = runtime.requireInternalModule(JASMINE);
    const jasmine = jasmineFactory.create({
      process,
      testPath,
      testTimeout: globalConfig.testTimeout
    });
    const env = jasmine.getEnv();
  
    const jasmineInterface = jasmineFactory._interface(jasmine, env);
  
    Object.assign(environment.global, jasmineInterface);
    env.addReporter(jasmineInterface.jsApiReporter); // TODO: Remove config option if V8 exposes some way of getting location of caller
    // in a future version
  
    if (config.testLocationInResults === true) {
      const originalIt = environment.global.it;
  
      environment.global.it = (...args) => {
        const stack = (0, _sourceMap.getCallsite)(1, runtime.getSourceMaps());
        const it = originalIt(...args); // @ts-ignore
  
        it.result.__callsite = stack;
        return it;
      };
  
      const originalXit = environment.global.xit;
  
      environment.global.xit = (...args) => {
        const stack = (0, _sourceMap.getCallsite)(1, runtime.getSourceMaps());
        const xit = originalXit(...args); // @ts-ignore
  
        xit.result.__callsite = stack;
        return xit;
      };
  
      const originalFit = environment.global.fit;
  
      environment.global.fit = (...args) => {
        const stack = (0, _sourceMap.getCallsite)(1, runtime.getSourceMaps());
        const fit = originalFit(...args); // @ts-ignore
  
        fit.result.__callsite = stack;
        return fit;
      };
    }
  
    (0, _jasmineAsyncInstall.default)(globalConfig, environment.global);
    (0, _each.default)(environment);
    environment.global.test = environment.global.it;
    environment.global.it.only = environment.global.fit;
    environment.global.it.todo = env.todo;
    environment.global.it.skip = environment.global.xit;
    environment.global.xtest = environment.global.xit;
    environment.global.describe.skip = environment.global.xdescribe;
    environment.global.describe.only = environment.global.fdescribe;
  
    if (config.timers === 'fake') {
      environment.fakeTimers.useFakeTimers();
    }
  
    env.beforeEach(() => {
      if (config.resetModules) {
        runtime.resetModules();
      }
  
      if (config.clearMocks) {
        runtime.clearAllMocks();
      }
  
      if (config.resetMocks) {
        runtime.resetAllMocks();
  
        if (config.timers === 'fake') {
          environment.fakeTimers.useFakeTimers();
        }
      }
  
      if (config.restoreMocks) {
        runtime.restoreAllMocks();
      }
    });
    env.addReporter(reporter);
    runtime
      .requireInternalModule(path.resolve(__dirname, './jestExpect.js'))
      .default({
        expand: globalConfig.expand
      });
  
    if (globalConfig.errorOnDeprecated) {
      (0, _errorOnPrivate.installErrorOnPrivate)(environment.global);
    } else {
      Object.defineProperty(jasmine, 'DEFAULT_TIMEOUT_INTERVAL', {
        configurable: true,
        enumerable: true,
  
        get() {
          return this._DEFAULT_TIMEOUT_INTERVAL;
        },
  
        set(value) {
          this._DEFAULT_TIMEOUT_INTERVAL = value;
        }
      });
    }
  
    const snapshotState = runtime
      .requireInternalModule(path.resolve(__dirname, './setup_jest_globals.js'))
      .default({
        config,
        globalConfig,
        localRequire: runtime.requireModule.bind(runtime),
        testPath
      });
    config.setupFilesAfterEnv.forEach(path => runtime.requireModule(path));
  
    if (globalConfig.enabledTestsMap) {
      env.specFilter = spec => {
        const suiteMap =
          globalConfig.enabledTestsMap &&
          globalConfig.enabledTestsMap[spec.result.testPath];
        return (suiteMap && suiteMap[spec.result.fullName]) || false;
      };
    } else if (globalConfig.testNamePattern) {
      const testNameRegex = new RegExp(globalConfig.testNamePattern, 'i');
  
      env.specFilter = spec => testNameRegex.test(spec.getFullName());
    }
  
    runtime.requireModule(testPath);
    await env.execute();
    const results = await reporter.getResults();
    return addSnapshotData(results, snapshotState);
  }
  
  const addSnapshotData = (results, snapshotState) => {
    results.testResults.forEach(({fullName, status}) => {
      if (status === 'pending' || status === 'failed') {
        // if test is skipped or failed, we don't want to mark
        // its snapshots as obsolete.
        snapshotState.markSnapshotsAsCheckedForTest(fullName);
      }
    });
    const uncheckedCount = snapshotState.getUncheckedCount();
    const uncheckedKeys = snapshotState.getUncheckedKeys();
  
    if (uncheckedCount) {
      snapshotState.removeUncheckedKeys();
    }
  
    const status = snapshotState.save();
    results.snapshot.fileDeleted = status.deleted;
    results.snapshot.added = snapshotState.added;
    results.snapshot.matched = snapshotState.matched;
    results.snapshot.unmatched = snapshotState.unmatched;
    results.snapshot.updated = snapshotState.updated;
    results.snapshot.unchecked = !status.deleted ? uncheckedCount : 0; // Copy the array to prevent memory leaks
  
    results.snapshot.uncheckedKeys = Array.from(uncheckedKeys);
    return results;
  }; // eslint-disable-next-line no-redeclare
  
  module.exports = jasmine2;
  