Add tests for the Recipe model

This commit is contained in:
Andrew Miner
2015-01-28 09:59:35 -08:00
parent b4fe6b20be
commit 7ee0b55411
3 changed files with 104 additions and 5 deletions
+7 -4
View File
@@ -16,7 +16,7 @@ module.exports = class Recipe extends BaseModel
if attributes.item? if attributes.item?
attributes.name = attributes.item.name attributes.name = attributes.item.name
attributes.slug = attributes.item.slug attributes.slug = attributes.item.slug
attributes.output ?= [new Stack slug:item.slug, quantity:1] attributes.output ?= [new Stack slug:attributes.item.slug, quantity:1]
if not attributes.name? then throw new Error 'attributes.name is required' if not attributes.name? then throw new Error 'attributes.name is required'
if not attributes.input? then throw new Error 'attributes.input is required' if not attributes.input? then throw new Error 'attributes.input is required'
@@ -33,10 +33,8 @@ module.exports = class Recipe extends BaseModel
# Public Methods ############################################################################### # Public Methods ###############################################################################
getItemSlugAt: (patternSlot)-> getItemSlugAt: (patternSlot)->
pattern = if @pattern? then @pattern else @_computeDefaultPattern()
trueIndex = 0:0, 1:1, 2:2, 3:4, 4:5, 5:6, 6:8, 7:9, 8:10 trueIndex = 0:0, 1:1, 2:2, 3:4, 4:5, 5:6, 6:8, 7:9, 8:10
patternDigit = pattern[trueIndex[patternSlot]] patternDigit = @pattern[trueIndex[patternSlot]]
return null unless patternDigit? return null unless patternDigit?
return null unless patternDigit.match /[0-9]/ return null unless patternDigit.match /[0-9]/
@@ -45,6 +43,11 @@ module.exports = class Recipe extends BaseModel
return stack.slug return stack.slug
doesProduce: (itemSlug)->
for stack in @output
return true if stack.slug is itemSlug
return false
# Object Overrides ############################################################################# # Object Overrides #############################################################################
toString: -> toString: ->
+95
View File
@@ -0,0 +1,95 @@
###
Crafting Guide - recipe.test.coffee
Copyright (c) 2015 by Redwood Labs
All rights reserved.
###
Recipe = require '../src/scripts/models/recipe'
Stack = require '../src/scripts/models/stack'
########################################################################################################################
input = output = pattern = recipe = null
########################################################################################################################
describe 'Recipe', ->
describe 'constructor', ->
beforeEach ->
input = [ new Stack(slug:'iron_gear'), new Stack(slug:'gold_ingot', quantity:4) ]
pattern = '.1. 101 .1.'
it 'requires a name', ->
expect(-> new Recipe input:input, pattern:pattern).to.throw Error, 'attributes.name is required'
it 'requires input', ->
expect(-> new Recipe name:'Gold Gear', pattern:pattern).to.throw Error, 'attributes.input is required'
it 'requires a pattern', ->
expect(-> new Recipe name:'Gold Gear', input:input).to.throw Error, 'attributes.pattern is required'
it 'allows an item to provide required attributes', ->
recipe = new Recipe item:{name:'Gold Gear', slug:'gold_gear'}, input:input, pattern:pattern
recipe.name.should.equal 'Gold Gear'
(o.slug for o in recipe.output).should.eql ['gold_gear']
it 'creates default output', ->
recipe = new Recipe name:'Gold Gear', input:input, pattern:pattern
recipe.output.length.should.equal 1
recipe.output[0].slug.should.equal 'gold_gear'
recipe.output[0].quantity.should.equal 1
it 'assigns a default slug', ->
recipe = new Recipe name:'Gold Gear', input:input, pattern:pattern
recipe.slug.should.equal 'gold_gear'
describe 'getItemSlugAt', ->
beforeEach ->
input = [ new Stack(slug:'iron_gear'), new Stack(slug:'gold_ingot', quantity:4) ]
recipe = new Recipe name:'Gold Gear', input:input, pattern:'.1. 101 .1.'
it 'returns the proper item for an early slot', ->
recipe.getItemSlugAt(1).should.equal 'gold_ingot'
it 'returns the proper item for a late slot', ->
recipe.getItemSlugAt(4).should.equal 'iron_gear'
it 'returns null for an invalid slot', ->
expect(recipe.getItemSlugAt(12)).to.be.null
describe 'doesProduce', ->
beforeEach ->
input = [ new Stack(slug:'empty_cell'), new Stack(slug:'water_bucket') ]
output = [ new Stack(slug:'water_cell'), new Stack(slug:'bucket') ]
recipe = new Recipe name:'Water Cell', input:input, output:output, pattern:'... .0. .1.'
it 'returns true when asked for the primary output', ->
recipe.doesProduce('water_cell').should.be.true
it 'returns true when asked for a secondary output', ->
recipe.doesProduce('bucket').should.be.true
it 'return false when asked for a non-output', ->
recipe.doesProduce('cake').should.be.false
describe '_parsePattern', ->
beforeEach ->
recipe = new Recipe name:'Oak Wood Planks', input:[new Stack slug:'oak_wood'], pattern:'... .0. ...'
it 'normalizes invalid characters', ->
recipe._parsePattern('$$0 #() 010').should.equal '..0 ... 010'
it 'removes extra characters', ->
recipe._parsePattern('000 000 000 000').should.equal '000 000 000'
it 'fills in missing characters', ->
recipe._parsePattern('000000').should.equal '000 000 ...'
it 'fills in spaces', ->
recipe._parsePattern('000000000').should.equal '000 000 000'
+2 -1
View File
@@ -19,7 +19,7 @@ global.should = chai.should()
global.util = require 'util' global.util = require 'util'
Logger = require '../src/scripts/logger' Logger = require '../src/scripts/logger'
global.logger = new Logger level:Logger.TRACE global.logger = new Logger level:Logger.DEBUG
require '../src/scripts/polyfill' require '../src/scripts/polyfill'
require '../src/scripts/underscore_mixins' require '../src/scripts/underscore_mixins'
@@ -35,6 +35,7 @@ require './mod.test'
require './mod_pack.test' require './mod_pack.test'
require './mod_version.test' require './mod_version.test'
require './parser_versions/mod_version_parser_v1.test' require './parser_versions/mod_version_parser_v1.test'
require './recipe.test'
require './string_builder.test' require './string_builder.test'
mocha.checkLeaks() mocha.checkLeaks()