<html>
<head>
  <meta name="referrer" content="always">
  <link href="../node_modules/mocha/mocha.css" rel="stylesheet">
  <script src="jquery-2.0.3.min.js"></script>
</head>
<body>

<div id="mocha"></div>

<script type="text/javascript" charset="utf-8">
(function() {
  // Deprecated APIs are still supported and should be tested.
  process.throwDeprecation = false

  const path = require('path')
  const electron = require('electron')
  const { remote, ipcRenderer } = electron

  // Check if we are running in CI.
  const isCi = remote.getGlobal('isCi')

  if (!isCi) {
    const win = remote.getCurrentWindow()
    win.show()
    win.focus()
  }

  // Show DevTools.
  document.oncontextmenu = (e) => {
    remote.getCurrentWindow().inspectElement(e.clientX, e.clientY)
  }

  // Rediret all output to browser.
  if (isCi) {
    global.__defineGetter__('console', function () {
      return {
        log: (...args) => ipcRenderer.send('console.log', args),
        error: (...args) => ipcRenderer.send('console.error', args)
      }
    })
  }

  const { Coverage } = require('electabul')
  const Mocha = require('mocha')

  const mocha = new Mocha(process.env.MOCHA_REPORTER
    ? { reporter: process.env.MOCHA_REPORTER }
    : undefined)

  if (!process.env.MOCHA_REPORTER) {
    mocha.ui('bdd').reporter(isCi ? 'tap' : 'html')
  }
  mocha.timeout(isCi ? 30000 : 10000)

  const query = Mocha.utils.parseQuery(window.location.search || '')
  if (query.grep) mocha.grep(query.grep)
  if (query.invert) mocha.invert()

  // Read all test files.
  const walker = require('walkdir').walk(path.dirname(__dirname), {
    no_recurse: true
  })

  const crashSpec = 'api-crash-reporter-spec.js'

  // This allows you to run specific modules only:
  // npm run test -match=menu
  const moduleMatch = process.env.npm_config_match
    ? new RegExp(process.env.npm_config_match, 'g')
    : null

  walker.on('file', (file) => {
    if (/-spec\.js$/.test(file) && !file.includes(crashSpec) &&
        (!moduleMatch || moduleMatch.test(file))) {
      mocha.addFile(file)
    }
  })

  walker.on('end', () => {
    if (!process.env.npm_config_match || new RegExp(process.env.npm_config_match, 'g').test(crashSpec)) {
      mocha.addFile(path.resolve(__dirname, '..', crashSpec))
    }

    const runner = mocha.run(() => {
      if (isCi && runner.hasOnly) {
        try {
          throw new Error('A spec contains a call to it.only or describe.only and should be reverted.')
        } catch (error) {
          console.error(error.stack || error)
        }
        ipcRenderer.send('process.exit', 1)
        return
      }

      Mocha.utils.highlightTags('code')

      const coverage = new Coverage({
        libPath: path.join(__dirname, '..', '..', 'lib'),
        outputPath: path.join(__dirname, '..', '..', 'out', 'coverage'),
        formats: ['text', 'lcov']
      })
      coverage.addCoverage(ipcRenderer.sendSync('get-main-process-coverage'))
      coverage.generateReport()

      if (isCi) {
        ipcRenderer.send('process.exit', runner.failures)
      }
    })
  })
})()
</script>
</body>
</html>