mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-05-01 08:23:57 -04:00
Add multithreading to verifier.
This commit is contained in:
parent
c357aa4f25
commit
42b49975e8
3 changed files with 81 additions and 18 deletions
app
templates/editor/verifier
views/editor/verifier
|
@ -6,15 +6,23 @@ block content
|
||||||
div.col-sm-3
|
div.col-sm-3
|
||||||
p.alert.alert-success(style="padding: 5px")
|
p.alert.alert-success(style="padding: 5px")
|
||||||
| Passed: #{view.passed}
|
| Passed: #{view.passed}
|
||||||
|
div.col-sm-3
|
||||||
|
p.alert.alert-warning(style="padding: 5px")
|
||||||
|
| Test Problem: #{view.problem}
|
||||||
div.col-sm-3
|
div.col-sm-3
|
||||||
p.alert.alert-danger(style="padding: 5px")
|
p.alert.alert-danger(style="padding: 5px")
|
||||||
| Failed: #{view.failed}
|
| Failed: #{view.failed}
|
||||||
|
div.col-sm-3
|
||||||
|
p.alert.alert-info(style="padding: 5px")
|
||||||
|
| To Run: #{view.testCount - view.passed - view.problem - view.failed}
|
||||||
|
|
||||||
if view.levelIDs
|
if view.levelIDs
|
||||||
.progress
|
.progress
|
||||||
.progress-bar.progress-bar-success(role="progressbar" style="width: #{100*view.passed/view.testCount}%")
|
.progress-bar.progress-bar-success(role="progressbar" style="width: #{100*view.passed/view.testCount}%")
|
||||||
|
.progress-bar.progress-bar-warning(role="progressbar" style="width: #{100*view.problem/view.testCount}%")
|
||||||
.progress-bar.progress-bar-danger(role="progressbar" style="width: #{100*view.failed/view.testCount}%")
|
.progress-bar.progress-bar-danger(role="progressbar" style="width: #{100*view.failed/view.testCount}%")
|
||||||
|
|
||||||
|
|
||||||
each test, id in view.tests
|
each test, id in view.tests
|
||||||
if test.level
|
if test.level
|
||||||
.pull-right
|
.pull-right
|
||||||
|
@ -55,7 +63,10 @@ block content
|
||||||
else
|
else
|
||||||
div(style='color: red') ✘ #{k} (#{v.status} vs #{test.solution.goals[k]})
|
div(style='color: red') ✘ #{k} (#{v.status} vs #{test.solution.goals[k]})
|
||||||
else
|
else
|
||||||
h3 Running....
|
h3 Pending....
|
||||||
|
|
||||||
|
if test.error
|
||||||
|
pre(style="color: red") #{test.error}
|
||||||
|
|
||||||
else
|
else
|
||||||
h1 Loading Level...
|
h1 Loading Level...
|
||||||
|
|
|
@ -32,9 +32,9 @@ module.exports = class VerifierTest extends CocoClass
|
||||||
@grabLevelLoaderData()
|
@grabLevelLoaderData()
|
||||||
|
|
||||||
unless @solution
|
unless @solution
|
||||||
@updateCallback? state: 'error'
|
|
||||||
@error = 'No solution present...'
|
@error = 'No solution present...'
|
||||||
@state = 'error'
|
@state = 'error'
|
||||||
|
@updateCallback? state: 'error'
|
||||||
return
|
return
|
||||||
me.team = @team = 'humans'
|
me.team = @team = 'humans'
|
||||||
@setupGod()
|
@setupGod()
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
RootView = require 'views/core/RootView'
|
RootView = require 'views/core/RootView'
|
||||||
template = require 'templates/editor/verifier/verifier-view'
|
template = require 'templates/editor/verifier/verifier-view'
|
||||||
VerifierTest = require './VerifierTest'
|
VerifierTest = require './VerifierTest'
|
||||||
|
SuperModel = require 'models/SuperModel'
|
||||||
|
|
||||||
module.exports = class VerifierView extends RootView
|
module.exports = class VerifierView extends RootView
|
||||||
className: 'style-flat'
|
className: 'style-flat'
|
||||||
|
@ -13,6 +14,8 @@ module.exports = class VerifierView extends RootView
|
||||||
# TODO: sort tests by unexpected result first
|
# TODO: sort tests by unexpected result first
|
||||||
@passed = 0
|
@passed = 0
|
||||||
@failed = 0
|
@failed = 0
|
||||||
|
@problem = 0
|
||||||
|
|
||||||
testLevels = [
|
testLevels = [
|
||||||
'dungeons-of-kithgard', 'gems-in-the-deep', 'shadow-guard', 'kounter-kithwise', 'crawlways-of-kithgard',
|
'dungeons-of-kithgard', 'gems-in-the-deep', 'shadow-guard', 'kounter-kithwise', 'crawlways-of-kithgard',
|
||||||
'enemy-mine', 'illusory-interruption', 'forgetful-gemsmith', 'signs-and-portents', 'favorable-odds',
|
'enemy-mine', 'illusory-interruption', 'forgetful-gemsmith', 'signs-and-portents', 'favorable-odds',
|
||||||
|
@ -26,30 +29,79 @@ module.exports = class VerifierView extends RootView
|
||||||
'patrol-buster', 'endangered-burl', 'thumb-biter', 'gems-or-death', 'village-guard', 'thornbush-farm',
|
'patrol-buster', 'endangered-burl', 'thumb-biter', 'gems-or-death', 'village-guard', 'thornbush-farm',
|
||||||
'back-to-back', 'ogre-encampment', 'woodland-cleaver', 'shield-rush', 'range-finder', 'munchkin-swarm',
|
'back-to-back', 'ogre-encampment', 'woodland-cleaver', 'shield-rush', 'range-finder', 'munchkin-swarm',
|
||||||
'stillness-in-motion', 'the-agrippa-defense', 'backwoods-bombardier', 'coinucopia', 'copper-meadows',
|
'stillness-in-motion', 'the-agrippa-defense', 'backwoods-bombardier', 'coinucopia', 'copper-meadows',
|
||||||
'drop-the-flag', 'mind-the-trap', 'signal-corpse', 'rich-forager'
|
'drop-the-flag', 'mind-the-trap', 'signal-corpse', 'rich-forager',
|
||||||
|
|
||||||
|
"the-mighty-sand-yak", "oasis", "sarven-road", "sarven-gaps", "thunderhooves", "minesweeper",
|
||||||
|
"medical-attention", "sarven-sentry", "keeping-time", "hoarding-gold", "decoy-drill", "continuous-alchemy",
|
||||||
|
"dust", "desert-combat", "sarven-savior", "lurkers", "preferential-treatment", "sarven-shepherd",
|
||||||
|
"shine-getter"
|
||||||
|
|
||||||
|
#"the-dunes", "the-mighty-sand-yak", "oasis", "basin-stampede", "sarven-road", "sarven-gaps",
|
||||||
|
#"crossroads", "thunderhooves", "operation-killdeer", "medical-attention", "the-great-yak-stampede",
|
||||||
|
#"minesweeper", "sarven-sentry", "keeping-time", "hoarding-gold", "bookkeeper", "decoy-drill",
|
||||||
|
#"continuous-alchemy", "yakstraction", "sarven-brawl", "desert-combat", "dust", "dont-rush-be-quiet",
|
||||||
|
#"sarven-rescue", "sacred-statue", "mirage-maker", "sarven-savior", "odd-sandstorm", "lurkers",
|
||||||
|
#"preferential-treatment", "bash-em-all", "sarven-shepherd", "shine-getter", "sand-snakes",
|
||||||
|
#"the-trials", "mad-maxer", "mad-maxer-strikes-back", "mad-maxer-sells-out", "mad-maxer-gets-greedy",
|
||||||
|
#"mad-maxer-redemption", "sarven-treasure", "harrowland", "sarven-siege", "goalkeeper",
|
||||||
|
#"clash-of-clones", "stranded-in-the-dunes", "sarven-sum", "golden-mirage", "diamond-dozen",
|
||||||
|
#"brittle-morale", "zig-zag-and-zoom", "cubic-minefield"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
defaultCores = 2
|
||||||
|
cores = Math.max(window.navigator.hardwareConcurrency, defaultCores)
|
||||||
|
|
||||||
#testLevels = testLevels.slice 0, 15
|
#testLevels = testLevels.slice 0, 15
|
||||||
@linksQueryString = window.location.search
|
@linksQueryString = window.location.search
|
||||||
@levelIDs = if @levelID then [@levelID] else testLevels
|
@levelIDs = if @levelID then [@levelID] else testLevels
|
||||||
@testCount = @levelIDs.length * 2 #One per langauge
|
|
||||||
#supermodel = if @levelID then @supermodel else undefined
|
#supermodel = if @levelID then @supermodel else undefined
|
||||||
@tests = []
|
@tests = []
|
||||||
async.eachSeries @levelIDs, (levelID, lnext) =>
|
@taskList = []
|
||||||
async.eachSeries ['python','javascript'], (lang, next) =>
|
|
||||||
test = new VerifierTest levelID, (e) =>
|
@tasksList = _.flatten _.map @levelIDs, (v) ->
|
||||||
|
console.log(v)
|
||||||
|
_.map ['python', 'javascript'], (l) ->
|
||||||
|
level: v, language: l
|
||||||
|
|
||||||
|
@testCount = @tasksList.length
|
||||||
|
|
||||||
|
chunks = _.groupBy @tasksList, (v,i) -> i%cores
|
||||||
|
supermodels = [@supermodel]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
_.forEach chunks, (chunk, i) =>
|
||||||
|
_.delay =>
|
||||||
|
parentSuperModel = supermodels[supermodels.length-1]
|
||||||
|
chunkSupermodel = new SuperModel()
|
||||||
|
chunkSupermodel.models = _.clone parentSuperModel.models
|
||||||
|
chunkSupermodel.collections = _.clone parentSuperModel.collections
|
||||||
|
supermodels.push chunkSupermodel
|
||||||
|
|
||||||
|
async.eachSeries chunk, (task, next) =>
|
||||||
|
test = new VerifierTest task.level, (e) =>
|
||||||
|
@update(e)
|
||||||
|
if e.state in ['complete', 'error']
|
||||||
|
if e.state is 'complete'
|
||||||
|
if test.isSucessful()
|
||||||
|
++@passed
|
||||||
|
else
|
||||||
|
++@failed
|
||||||
|
else
|
||||||
|
++@problem
|
||||||
|
|
||||||
|
next()
|
||||||
|
, chunkSupermodel, task.language
|
||||||
|
@tests.unshift test
|
||||||
|
@render()
|
||||||
|
, => @render()
|
||||||
|
, if i > 0 then 5000 + i * 1000 else 0
|
||||||
|
|
||||||
@update(e)
|
|
||||||
if e.state in ['complete', 'error']
|
|
||||||
if test.isSucessful()
|
|
||||||
++@passed
|
|
||||||
else
|
|
||||||
++@failed
|
|
||||||
next()
|
|
||||||
, @supermodel, lang
|
|
||||||
@tests.unshift test
|
|
||||||
, -> lnext()
|
|
||||||
, () => @render()
|
|
||||||
update: (event) =>
|
update: (event) =>
|
||||||
# TODO: show unworkable tests instead of hiding them
|
# TODO: show unworkable tests instead of hiding them
|
||||||
# TODO: destroy them Tests after or something
|
# TODO: destroy them Tests after or something
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue