// Copyright (C) 2018 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

const fs = require('fs');
const path = require('path');
const NodeEnvironment = require('jest-environment-node');
const puppeteer = require('puppeteer');

module.exports = class HeadlessEnvironment extends NodeEnvironment {
  constructor(config) {
    super(config);
  }

  async setup() {
    await super.setup();
    this.global.__BROWSER__ = await puppeteer.launch();
  }

  async teardown() {
    await this.global.__BROWSER__.close();
    await super.teardown();
  }

  runScript(script) {
    return super.runScript(script);
  }
}
