/ src / initialize-test-window.coffee
initialize-test-window.coffee
  1  ipcHelpers = require './ipc-helpers'
  2  
  3  cloneObject = (object) ->
  4    clone = {}
  5    clone[key] = value for key, value of object
  6    clone
  7  
  8  module.exports = ({blobStore}) ->
  9    {remote} = require 'electron'
 10  
 11    exitWithStatusCode = (status) ->
 12      remote.app.emit('will-quit')
 13      remote.process.exit(status)
 14  
 15    try
 16      path = require 'path'
 17      {ipcRenderer} = require 'electron'
 18      getWindowLoadSettings = require './get-window-load-settings'
 19      CompileCache = require './compile-cache'
 20      AtomEnvironment = require '../src/atom-environment'
 21      ApplicationDelegate = require '../src/application-delegate'
 22      Clipboard = require '../src/clipboard'
 23      TextEditor = require '../src/text-editor'
 24      {updateProcessEnv} = require('./update-process-env')
 25      require './electron-shims'
 26  
 27      ipcRenderer.on 'environment', (event, env) ->
 28        updateProcessEnv(env)
 29  
 30      {testRunnerPath, legacyTestRunnerPath, headless, logFile, testPaths, env} = getWindowLoadSettings()
 31  
 32      if headless
 33        # Install console functions that output to stdout and stderr.
 34        util = require 'util'
 35  
 36        Object.defineProperties process,
 37          stdout: {value: remote.process.stdout}
 38          stderr: {value: remote.process.stderr}
 39  
 40        console.log = (args...) -> process.stdout.write "#{util.format(args...)}\n"
 41        console.error = (args...) -> process.stderr.write "#{util.format(args...)}\n"
 42      else
 43        # Show window synchronously so a focusout doesn't fire on input elements
 44        # that are focused in the very first spec run.
 45        remote.getCurrentWindow().show()
 46  
 47      handleKeydown = (event) ->
 48        # Reload: cmd-r / ctrl-r
 49        if (event.metaKey or event.ctrlKey) and event.keyCode is 82
 50          ipcHelpers.call('window-method', 'reload')
 51  
 52        # Toggle Dev Tools: cmd-alt-i (Mac) / ctrl-shift-i (Linux/Windows)
 53        if event.keyCode is 73 and (
 54          (process.platform is 'darwin' and event.metaKey and event.altKey) or
 55          (process.platform isnt 'darwin' and event.ctrlKey and event.shiftKey))
 56            ipcHelpers.call('window-method', 'toggleDevTools')
 57  
 58        # Close: cmd-w / ctrl-w
 59        if (event.metaKey or event.ctrlKey) and event.keyCode is 87
 60          ipcHelpers.call('window-method', 'close')
 61  
 62        # Copy: cmd-c / ctrl-c
 63        if (event.metaKey or event.ctrlKey) and event.keyCode is 67
 64          atom.clipboard.write(window.getSelection().toString())
 65          
 66      window.addEventListener('keydown', handleKeydown, true)
 67  
 68      # Add 'exports' to module search path.
 69      exportsPath = path.join(getWindowLoadSettings().resourcePath, 'exports')
 70      require('module').globalPaths.push(exportsPath)
 71      process.env.NODE_PATH = exportsPath # Set NODE_PATH env variable since tasks may need it.
 72  
 73      updateProcessEnv(env)
 74  
 75      # Set up optional transpilation for packages under test if any
 76      FindParentDir = require 'find-parent-dir'
 77      if packageRoot = FindParentDir.sync(testPaths[0], 'package.json')
 78        packageMetadata = require(path.join(packageRoot, 'package.json'))
 79        if packageMetadata.atomTranspilers
 80          CompileCache.addTranspilerConfigForPath(packageRoot, packageMetadata.name, packageMetadata, packageMetadata.atomTranspilers)
 81  
 82      document.title = "Spec Suite"
 83  
 84      clipboard = new Clipboard
 85      TextEditor.setClipboard(clipboard)
 86      TextEditor.viewForItem = (item) -> atom.views.getView(item)
 87  
 88      testRunner = require(testRunnerPath)
 89      legacyTestRunner = require(legacyTestRunnerPath)
 90      buildDefaultApplicationDelegate = -> new ApplicationDelegate()
 91      buildAtomEnvironment = (params) ->
 92        params = cloneObject(params)
 93        params.clipboard = clipboard unless params.hasOwnProperty("clipboard")
 94        params.blobStore = blobStore unless params.hasOwnProperty("blobStore")
 95        params.onlyLoadBaseStyleSheets = true unless params.hasOwnProperty("onlyLoadBaseStyleSheets")
 96        atomEnvironment = new AtomEnvironment(params)
 97        atomEnvironment.initialize(params)
 98        TextEditor.setScheduler(atomEnvironment.views)
 99        atomEnvironment
100  
101      promise = testRunner({
102        logFile, headless, testPaths, buildAtomEnvironment, buildDefaultApplicationDelegate, legacyTestRunner
103      })
104  
105      promise.then (statusCode) ->
106        exitWithStatusCode(statusCode) if getWindowLoadSettings().headless
107    catch error
108      if getWindowLoadSettings().headless
109        console.error(error.stack ? error)
110        exitWithStatusCode(1)
111      else
112        throw error