mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-11-24 16:17:57 -05:00
147 lines
4.8 KiB
CoffeeScript
147 lines
4.8 KiB
CoffeeScript
useEsper = true
|
|
bowerComponentsPath = './bower_components/'
|
|
headlessClientPath = './headless_client/'
|
|
require 'aether'
|
|
# SETTINGS
|
|
options =
|
|
workerCode: require headlessClientPath + 'worker_world'
|
|
debug: false # Enable logging of ajax calls mainly
|
|
testing: false # Instead of simulating 'real' games, use the same one over and over again. Good for leak hunting.
|
|
testFile: require headlessClientPath + 'test.js'
|
|
leakTest: false # Install callback that tries to find leaks automatically
|
|
exitOnLeak: false # Exit if leak is found. Only useful if leaktest is set to true, obviously.
|
|
heapdump: false # Dumps the whole heap after every pass. The heap dumps can then be viewed in Chrome browser.
|
|
headlessClient: true
|
|
|
|
options.heapdump = require('heapdump') if options.heapdump
|
|
server = if options.testing then 'http://127.0.0.1:3000' else 'http://direct.codecombat.com'
|
|
# Use direct instead of live site because jQlone's requests proxy doesn't do caching properly and CloudFlare gets too aggressive.
|
|
|
|
# Disabled modules
|
|
disable = [
|
|
'lib/AudioPlayer'
|
|
'locale/locale'
|
|
'../locale/locale'
|
|
]
|
|
|
|
# Start of the actual code. Setting up the enivronment to match the environment of the browser
|
|
|
|
# Global emulated stuff
|
|
GLOBAL.window = GLOBAL
|
|
GLOBAL.document =
|
|
location:
|
|
pathname: 'headless_client'
|
|
search: ''
|
|
|
|
GLOBAL.console.debug = console.log
|
|
GLOBAL.serverConfig =
|
|
picoCTF: false
|
|
production: false
|
|
|
|
#try
|
|
# GLOBAL.Worker = require('webworker-threads').Worker
|
|
#catch e
|
|
# GLOBAL.Worker = require('./headless_client/fork_web_worker').Worker
|
|
# options.workerCode = './worker_world.coffee'
|
|
#
|
|
#Worker::removeEventListener = (what) ->
|
|
# if what is 'message'
|
|
# @onmessage = -> #This webworker api has only one event listener at a time.
|
|
GLOBAL.tv4 = require('tv4').tv4
|
|
GLOBAL.TreemaUtils = require bowerComponentsPath + 'treema/treema-utils'
|
|
GLOBAL.marked = setOptions: ->
|
|
store = {}
|
|
GLOBAL.localStorage =
|
|
getItem: (key) => store[key]
|
|
setItem: (key, s) => store[key] = s
|
|
removeItem: (key) => delete store[key]
|
|
GLOBAL.lscache = require bowerComponentsPath + 'lscache/lscache'
|
|
GLOBAL.esper = require bowerComponentsPath + 'esper.js/esper'
|
|
|
|
# Hook node.js require. See https://github.com/mfncooper/mockery/blob/master/mockery.js
|
|
# The signature of this function *must* match that of Node's Module._load,
|
|
# since it will replace that.
|
|
# (Why is there no easier way?)
|
|
# the path used for the loader. __dirname is module dependent.
|
|
path = __dirname
|
|
m = require 'module'
|
|
originalLoader = m._load
|
|
hookedLoader = (request, parent, isMain) ->
|
|
if request in disable or ~request.indexOf('templates')
|
|
console.log 'Ignored ' + request if options.debug
|
|
return class fake
|
|
else if /node_modules[\\\/]aether[\\\/]/.test parent.id
|
|
null # Let it through
|
|
else if '/' in request and not (request[0] is '.') or request is 'application'
|
|
#console.log 'making path', path + '/app/' + request, 'from', path, request, 'with parent', parent
|
|
request = path + '/app/' + request
|
|
else if request is 'underscore'
|
|
request = 'lodash'
|
|
console.log 'loading ' + request if options.debug
|
|
originalLoader request, parent, isMain
|
|
|
|
unhook = () ->
|
|
m._load = originalLoader
|
|
hook = () ->
|
|
m._load = hookedLoader
|
|
|
|
GLOBAL.$ = GLOBAL.jQuery = require headlessClientPath + 'jQlone'
|
|
$._debug = options.debug
|
|
$._server = server
|
|
|
|
do (setupLodash = this) ->
|
|
GLOBAL._ = require 'lodash'
|
|
_.str = require 'underscore.string'
|
|
_.string = _.str
|
|
_.mixin _.str.exports()
|
|
|
|
# load Backbone. Needs hooked loader to reroute underscore to lodash.
|
|
hook()
|
|
GLOBAL.Backbone = require bowerComponentsPath + 'backbone/backbone'
|
|
# Use original loader for theese
|
|
unhook()
|
|
Backbone.$ = $
|
|
require bowerComponentsPath + 'validated-backbone-mediator/backbone-mediator'
|
|
Backbone.Mediator.setValidationEnabled false
|
|
GLOBAL.Aether = require 'aether'
|
|
eval require('fs').readFileSync('./vendor/scripts/Box2dWeb-2.1.a.3.js', 'utf8')
|
|
GLOBAL.Box2D = Box2D
|
|
# Set up new loader. Again.
|
|
hook()
|
|
|
|
|
|
SuperModel = require 'models/SuperModel'
|
|
VerifierTest = require('views/editor/verifier/VerifierTest')
|
|
|
|
supermodel = new SuperModel()
|
|
|
|
oldGetQueryVariable = require('core/utils').getQueryVariable
|
|
require('core/utils').getQueryVariable = (args...) ->
|
|
return useEsper if args[0] is 'esper'
|
|
oldGetQueryVariable args...
|
|
|
|
list = process.argv.slice(2);
|
|
async = require 'async'
|
|
|
|
|
|
|
|
async.eachSeries list, (item, next) ->
|
|
async.eachSeries ['python','javascript'], (lang, lnext) ->
|
|
test = new VerifierTest item, (e) ->
|
|
return if e.state is 'running'
|
|
obj =
|
|
error: test.error
|
|
state: e.state
|
|
level: item,
|
|
language: lang
|
|
observed:
|
|
goals: _.mapValues(test.goals, 'status')
|
|
frameCount: test.frames
|
|
lastHash: test.lastFrameHash
|
|
solution:
|
|
test.solution
|
|
process.send?(obj)
|
|
console.log(obj)
|
|
lnext() if e.state in ['error','complete']
|
|
, supermodel, lang
|
|
, () -> next()
|