mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-02-25 05:54:51 -05:00
Added a function for denormalizing levels, extending level thang components and configs with ones from thang types.
This commit is contained in:
parent
4d4e321265
commit
29770bd220
5 changed files with 101 additions and 1 deletions
|
@ -25,6 +25,28 @@ module.exports = class Level extends CocoModel
|
||||||
o.thangTypes = (original: tt.get('original'), name: tt.get('name') for tt in supermodel.getModels ThangType)
|
o.thangTypes = (original: tt.get('original'), name: tt.get('name') for tt in supermodel.getModels ThangType)
|
||||||
o
|
o
|
||||||
|
|
||||||
|
denormalize: (supermodel) ->
|
||||||
|
o = $.extend true, {}, @attributes
|
||||||
|
for levelThang in o.thangs
|
||||||
|
@denormalizeThang(levelThang, supermodel)
|
||||||
|
o
|
||||||
|
|
||||||
|
denormalizeThang: (levelThang, supermodel) ->
|
||||||
|
thangType = supermodel.getModelByOriginal(ThangType, levelThang.thangType)
|
||||||
|
configs = {}
|
||||||
|
for thangComponent in levelThang.components
|
||||||
|
configs[thangComponent.original] = thangComponent
|
||||||
|
|
||||||
|
for defaultThangComponent in thangType.get('components')
|
||||||
|
if levelThangComponent = configs[defaultThangComponent.original]
|
||||||
|
# take the thang type default components and merge level-specific component config into it
|
||||||
|
copy = $.extend true, {}, defaultThangComponent.config
|
||||||
|
levelThangComponent.config = _.merge copy, levelThangComponent.config
|
||||||
|
|
||||||
|
else
|
||||||
|
# just add the component as is
|
||||||
|
levelThang.components.push $.extend true, {}, defaultThangComponent
|
||||||
|
|
||||||
sortSystems: (levelSystems, systemModels) ->
|
sortSystems: (levelSystems, systemModels) ->
|
||||||
[sorted, originalsSeen] = [[], {}]
|
[sorted, originalsSeen] = [[], {}]
|
||||||
visit = (system) ->
|
visit = (system) ->
|
||||||
|
|
|
@ -79,6 +79,10 @@ module.exports = class SuperModel extends Backbone.Model
|
||||||
modelURL = modelURL() if _.isFunction(modelURL)
|
modelURL = modelURL() if _.isFunction(modelURL)
|
||||||
return @models[modelURL] or null
|
return @models[modelURL] or null
|
||||||
|
|
||||||
|
getModelByOriginal: (ModelClass, original) ->
|
||||||
|
_.find @models, (m) ->
|
||||||
|
m.get('original') is original and m.constructor.className is ModelClass.className
|
||||||
|
|
||||||
getModelByOriginalAndMajorVersion: (ModelClass, original, majorVersion=0) ->
|
getModelByOriginalAndMajorVersion: (ModelClass, original, majorVersion=0) ->
|
||||||
_.find @models, (m) ->
|
_.find @models, (m) ->
|
||||||
m.get('original') is original and m.get('version').major is majorVersion and m.constructor.className is ModelClass.className
|
m.get('original') is original and m.get('version').major is majorVersion and m.constructor.className is ModelClass.className
|
||||||
|
|
52
test/app/models/Level.spec.coffee
Normal file
52
test/app/models/Level.spec.coffee
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
SuperModel = require 'models/SuperModel'
|
||||||
|
Level = require 'models/Level'
|
||||||
|
ThangType = require 'models/ThangType'
|
||||||
|
|
||||||
|
describe 'Level', ->
|
||||||
|
describe 'denormalize', ->
|
||||||
|
level = new Level({
|
||||||
|
thangs: [
|
||||||
|
{
|
||||||
|
"thangType": "A"
|
||||||
|
"id": "Tharin"
|
||||||
|
"components": [
|
||||||
|
{"original": "a", "majorVersion": 0}
|
||||||
|
{"original": "b", "majorVersion": 0, "config": {i: 2}}
|
||||||
|
{"original": "c", "majorVersion": 0, "config": {i: 1, ii: 2, nest: {iii: 3}}}
|
||||||
|
# should add one more
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
|
||||||
|
thangType = new ThangType({
|
||||||
|
original: 'A'
|
||||||
|
version: {major: 0, minor: 0}
|
||||||
|
components: [
|
||||||
|
{"original": "a", "majorVersion": 0, "config": {i: 1}}
|
||||||
|
{"original": "c", "majorVersion": 0, "config": {i: 3, nest: {iv: 4}}}
|
||||||
|
{"original": "d", "majorVersion": 0, "config": {i: 1}}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
|
||||||
|
supermodel = new SuperModel()
|
||||||
|
supermodel.registerModel(thangType)
|
||||||
|
|
||||||
|
result = level.denormalize(supermodel)
|
||||||
|
tharinThangComponents = result.thangs[0].components
|
||||||
|
|
||||||
|
it 'adds default configs to thangs without any config', ->
|
||||||
|
aComp = _.find tharinThangComponents, {original:'a'}
|
||||||
|
expect(_.isEqual(aComp.config, {i:1})).toBeTruthy()
|
||||||
|
|
||||||
|
it 'leaves alone configs for components the level thang has but the thang type does not', ->
|
||||||
|
bComp = _.find tharinThangComponents, {original:'b'}
|
||||||
|
expect(_.isEqual(bComp.config, {i:2})).toBeTruthy()
|
||||||
|
|
||||||
|
it 'merges configs where both the level thang and thang type have one, giving priority to the level thang', ->
|
||||||
|
cComp = _.find tharinThangComponents, {original:'c'}
|
||||||
|
expect(_.isEqual(cComp.config, {i: 1, ii: 2, nest: {iii: 3, iv: 4}})).toBeTruthy()
|
||||||
|
|
||||||
|
it 'adds components from the thang type that do not exist in the level thang', ->
|
||||||
|
dComp = _.find tharinThangComponents, {original:'d'}
|
||||||
|
expect(_.isEqual(dComp.config, {i: 1})).toBeTruthy()
|
23
test/app/vendor/lodash.spec.coffee
vendored
Normal file
23
test/app/vendor/lodash.spec.coffee
vendored
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
describe 'merge', ->
|
||||||
|
it 'combines nested objects recursively', ->
|
||||||
|
a = { i: 0, nest: { iii: 0 }}
|
||||||
|
b = { ii: 0, nest: { iv: 0 }}
|
||||||
|
res = _.merge(a, b)
|
||||||
|
expect(_.isEqual(res, { i: 0, ii: 0, nest: {iii:0, iv:0}})).toBeTruthy()
|
||||||
|
|
||||||
|
it 'overwrites values from source to object', ->
|
||||||
|
a = { i: 0 }
|
||||||
|
b = { i: 1 }
|
||||||
|
res = _.merge(a, b)
|
||||||
|
expect(_.isEqual(res, b)).toBeTruthy()
|
||||||
|
|
||||||
|
it 'treats arrays as atomic', ->
|
||||||
|
a = { i: 0 }
|
||||||
|
b = { i: [1,2,3] }
|
||||||
|
res = _.merge(a, b)
|
||||||
|
expect(_.isEqual(res, b)).toBeTruthy()
|
||||||
|
|
||||||
|
a = { i: [5,4,3] }
|
||||||
|
b = { i: [1,2,3] }
|
||||||
|
res = _.merge(a, b)
|
||||||
|
expect(_.isEqual(res, b)).toBeTruthy()
|
1
test/vendor/example.coffee
vendored
1
test/vendor/example.coffee
vendored
|
@ -1 +0,0 @@
|
||||||
massivelyUsefulTestExample = 'test...'
|
|
Loading…
Reference in a new issue