Refactoring tests and moving code to common module

1. All tests have been converted into regular command-line mocha
   tests (instead of running in the browser), and the deployment
   script has been changed to automatically fail any `--new`
   deployment which doesn't pass.
2. Several small class (e.g., `Logger`) have been moved into a common
   module, `crafting-guide-common` so that they may be shared between
   the client and server.
This commit is contained in:
Andrew Miner
2015-03-25 14:42:15 -07:00
parent c7322ccf83
commit 873434e938
28 changed files with 128 additions and 471 deletions
+22 -16
View File
@@ -5,6 +5,8 @@
# All rights reserved.
###
fs = require 'fs'
########################################################################################################################
module.exports = (grunt)->
@@ -23,15 +25,6 @@ module.exports = (grunt)->
files:
'./dist/js/main.js': ['./src/coffee/main.coffee']
test:
options:
transform: ['coffeeify']
browserifyOptions:
debug: true
extensions: ['.coffee']
files:
'./dist/js/test.js': ['./src/coffee/test/test.coffee']
markdown:
options:
browserifyOptions:
@@ -74,9 +67,6 @@ module.exports = (grunt)->
main:
files:
'./dist/js/main.js.map': ['./dist/js/main.js']
test:
files:
'./dist/js/test.js.map': ['./dist/js/test.js']
jade:
pages:
@@ -103,6 +93,18 @@ module.exports = (grunt)->
files:
'./src/coffee/views.js': ['./src/jade/templates/**/*.jade']
mochaTest:
options:
bail: true
color: true
reporter: 'list'
require: [
'coffee-script/register'
'./test/test_helper.coffee'
]
verbose: true
src: './test/**/*.test.coffee'
rsync:
static:
options:
@@ -151,14 +153,18 @@ module.exports = (grunt)->
sass:
files: ['./src/**/*.scss']
tasks: ['sass', 'copy:styles']
tests:
files: ['./src/**/*.coffee', './test/**/*.coffee']
tasks: ['browserify:test']
grunt.registerTask 'default', 'build'
grunt.registerTask 'build', [ 'rsync:non_html', 'copy', 'sass:build', 'jade', 'browserify', 'exorcise' ]
grunt.registerTask 'dist', ['clean', 'build', 'rsync:static', 'sass:dist', 'uglify']
grunt.registerTask 'dist', ['test', 'clean', 'build', 'rsync:static', 'sass:dist', 'uglify']
grunt.registerTask 'clean-watch', ['clean', 'build', 'watch']
grunt.registerTask 'link-deps', ->
grunt.file.mkdir './node_modules'
fs.unlinkSync './node_modules/crafting-guide-common'
fs.symlinkSync '../../crafting-guide-common/', './node_modules/crafting-guide-common'
grunt.registerTask 'test', ['mochaTest']
+6
View File
@@ -17,6 +17,8 @@
},
"homepage": "https://github.com/andrewminer/crafting-guide",
"devDependencies": {
"chai": "^1.10.0",
"coffee-script": "^1.9.1",
"coffeeify": "^1.0.0",
"express": "^4.10.6",
"grunt": "^0.4.5",
@@ -28,8 +30,12 @@
"grunt-contrib-uglify": "^0.7.0",
"grunt-contrib-watch": "^0.6.1",
"grunt-exorcise": "^0.2.0",
"grunt-mocha-test": "^0.12.7",
"grunt-rename": "^0.1.4",
"grunt-rsync": "^0.6.2",
"mocha": "^2.2.1",
"sinon": "^1.14.1",
"sinon-chai": "^2.7.0",
"underscore": "^1.7.0"
},
"dependencies": {
+7 -4
View File
@@ -20,10 +20,13 @@ fi
if [[ "$TARGET" == "new" ]]; then
find "$ROOT" -name ".DS_Store" | xargs rm
grunt clean dist
echo "Preparing to upload to S3..."
s3cmd sync -r --delete-removed --add-header="cache-control:max-age=1800" "$ROOT/" "s3://new.$SITE/"
grunt clean build
if grunt dist; then
echo "Preparing to upload to S3..."
s3cmd sync -r --delete-removed --add-header="cache-control:max-age=1800" "$ROOT/" "s3://new.$SITE/"
grunt clean build
else
echo "Aborting deployment"
fi
elif [[ "$TARGET" == "promote" ]]; then
aws s3 sync "s3://new.$SITE" "s3://$SITE" --delete
fi
@@ -7,11 +7,11 @@ All rights reserved.
BaseController = require './base_controller'
CraftingGridController = require './crafting_grid_controller'
{Duration} = require '../constants'
ImageLoader = require './image_loader'
Inventory = require '../models/inventory'
InventoryTableController = require './inventory_table_controller'
StringBuilder = require '../models/string_builder'
{Duration} = require '../constants'
{StringBuilder} = require 'crafting-guide-common'
########################################################################################################################
@@ -51,13 +51,10 @@ module.exports = class MarkdownSectionController extends BaseController
refs = tree[1].references
findLinkRefs = (node)=>
logger.debug "inspecting a #{node[0]}"
if node[0] is 'link_ref'
name = node[2]
logger.debug "found a link_ref for #{name}"
item = @modPack.findItemByName node[2]
if item?
logger.debug "found related item: #{item}"
node[0] = 'link'
node[1].href = Url.item itemSlug:item.slug.item, modSlug:item.slug.mod
delete node[1].ref
@@ -7,9 +7,9 @@ All rights reserved.
BaseController = require './base_controller'
CraftingGridController = require './crafting_grid_controller'
{Duration} = require '../constants'
ImageLoader = require './image_loader'
StringBuilder = require '../models/string_builder'
{Duration} = require '../constants'
{StringBuilder} = require 'crafting-guide-common'
########################################################################################################################
-98
View File
@@ -1,98 +0,0 @@
###
Crafting Guide - logger.coffee
Copyright (c) 2014-2015 by Redwood Labs
All rights reserved.
###
########################################################################################################################
module.exports = class Logger
@TRACE = {name:'TRACE ', value:0}
@DEBUG = {name:'DEBUG ', value:1}
@VERBOSE = {name:'VERBOSE', value:2}
@INFO = {name:'INFO ', value:3}
@WARNING = {name:'WARNING', value:4}
@ERROR = {name:'ERROR ', value:5}
@FATAL = {name:'FATAL ', value:6}
ALL_LEVELS = [@TRACE, @DEBUG, @VERBOSE, @INFO, @WARNING, @ERROR, @FATAL]
constructor: (options={})->
options.level ?= Logger.FATAL
@formatText = options.format
@formatText ?= "<%= timestamp %> | <%= level %> | <%= indent %><%= message %>"
@level = @_parseLevel options
@_format = _.template @formatText
@_indent = ''
# Public Methods ###############################################################################
indent: ->
@_indent += ' '
log: (level, message)->
return unless level.value >= @level.value
message = message() if _.isFunction message
entry = {timestamp:new Date(), level:level, message:message, indent:@_indent}
entry.level ?= @level
lines = @_formatEntry entry
if entry.level.value < Logger.WARNING.value
console.log(line) for line in lines
else
console.error(line) for line in lines
outdent: ->
@_indent = @_indent[0...@_indent.length - 4]
# Log Methods ##################################################################################
trace: (message)-> @log Logger.TRACE, message
debug: (message)-> @log Logger.DEBUG, message
verbose: (message)-> @log Logger.VERBOSE, message
info: (message)-> @log Logger.INFO, message
warning: (message)-> @log Logger.WARNING, message
error: (message)->
message = "#{message.stack}" if message.stack?
@log Logger.ERROR, message
fatal: (message)-> @log Logger.FATAL, message
# Private Methods ##############################################################################
_formatEntry: (entry, lines=[])->
message = entry.message.replace /\\n/g, '\n'
for line in message.split '\n'
result = []
result.push @_format
timestamp: "#{entry.timestamp}"
level: entry.level.name
message: line
indent: entry.indent
lines.push result.join ''
return lines
_parseLevel: (options)->
return Logger.FATAL unless _(options).has 'level'
level = options.level
if not level?
candidates = []
else if _.isString level
candidates = (l for l in ALL_LEVELS when l.name.trim().toLowerCase() is level.trim().toLowerCase())
else if _.isNumber level
candidates = (l for l in ALL_LEVELS when l.value is level)
else if level?
candidates = (l for l in ALL_LEVELS when l is level)
throw new Error "invalid level: #{level}" unless candidates.length > 0
return candidates[0]
+3 -3
View File
@@ -8,10 +8,10 @@ All rights reserved.
require './underscore_mixins'
require './polyfill'
views = require './views'
FeedbackController = require './controllers/feedback_controller'
Logger = require './logger'
CraftingGuideRouter = require './crafting_guide_router'
FeedbackController = require './controllers/feedback_controller'
views = require './views'
{Logger} = require 'crafting-guide-common'
########################################################################################################################
+6 -6
View File
@@ -5,12 +5,12 @@ Copyright (c) 2014-2015 by Redwood Labs
All rights reserved.
###
BaseModel = require './base_model'
{Event} = require '../constants'
ItemSlug = require './item_slug'
Recipe = require './recipe'
StringBuilder = require './string_builder'
{Url} = require '../constants'
BaseModel = require './base_model'
ItemSlug = require './item_slug'
Recipe = require './recipe'
{Event} = require '../constants'
{StringBuilder} = require 'crafting-guide-common'
{Url} = require '../constants'
########################################################################################################################
@@ -5,7 +5,7 @@ Copyright (c) 2015 by Redwood Labs
All rights reserved.
###
StringBuilder = require '../../models/string_builder'
{StringBuilder} = require 'crafting-guide-common'
########################################################################################################################
@@ -11,7 +11,7 @@ ItemSlug = require '../item_slug'
ModVersion = require '../mod_version'
Recipe = require '../recipe'
Stack = require '../simple_stack'
StringBuilder = require '../string_builder'
{StringBuilder} = require 'crafting-guide-common'
########################################################################################################################
+6 -5
View File
@@ -5,10 +5,10 @@ Copyright (c) 2014-2015 by Redwood Labs
All rights reserved.
###
BaseModel = require './base_model'
{Event} = require '../constants'
Stack = require './stack'
StringBuilder = require './string_builder'
BaseModel = require './base_model'
Stack = require './stack'
{Event} = require '../constants'
{StringBuilder} = require 'crafting-guide-common'
########################################################################################################################
@@ -119,7 +119,8 @@ module.exports = class Recipe extends BaseModel
actuallyProduces = not @isPassThroughFor stack.itemSlug
@_produces[stack.itemSlug.qualified] = actuallyProduces
return @_produces[itemSlug.qualified] or @_produces[itemSlug.item]
result = @_produces[itemSlug.qualified] or @_produces[itemSlug.item]
return result
requires: (itemSlug)->
for stack in @input
-122
View File
@@ -1,122 +0,0 @@
###
Crafting Guide - string_builder.coffee
Copyright (c) 2015 by Redwood Labs
All rights reserved.
###
########################################################################################################################
module.exports = class StringBuilder
constructor: (options={})->
options.indent ?= 0
options.indentString ?= ' '
@context = options.context
@_initialIndent = options.indent
@_indent = options.indent
@_indentString = options.indentString
@_pieces = []
# Public Methods ###############################################################################
call: ->
args = (arg for arg in arguments)
callback = args.pop()
args.unshift this
return unless _.isFunction callback
callback.apply null, args
clear: ->
@_indent = @_initialIndent
@_pieces = []
return this
indent: ->
@_indent += 1
return this
line: (args...)->
@push.apply(this, args) if args.length > 0
@push '\n'
loop: (list, options={})->
options.start ?= ''
options.end ?= ''
options.indent ?= false
options.delimiter ?= ', '
options.onEach ?= (builder, item)-> builder.push item
@_pushText options.start
if options.indent then @indent()
isFirst = true
for item in list
if not isFirst then @push options.delimiter
isFirst = false
options.onEach this, item
if options.indent then @outdent()
@_pushText options.end
return this
onlyIf: (condition, callback=null)->
return this unless condition
callback ?= (builder)-> # do nothing
callback this
return this
outdent: ->
@_indent -= 1
return this
push: ->
for i in [0...arguments.length]
arg = arguments[i]
if _.isArray arg
@push.apply this, arg
else if _.isString arg
@_pushText arg
else
@_pushText "#{arg}"
return this
# Object Overrides #############################################################################
toString: ->
return @_pieces.join ''
# Private Methods ##############################################################################
_pushIndent: ->
for i in [0...@_indent]
@_pieces.push @_indentString
_pushText: (text)->
return if text.length is 0
index = 0
if @_pieces.length > 0
lastPiece = @_pieces[@_pieces.length-1]
if lastPiece[lastPiece.length-1] is '\n'
@_pushIndent()
while true
newLineAt = text.indexOf '\n', index
break if newLineAt is -1
@_pieces.push text[index..newLineAt]
index = newLineAt + 1
break if newLineAt is text.length - 1
@_pushIndent()
if text.length > index
@_pieces.push text[index...text.length]
@@ -1,84 +0,0 @@
###
Crafting Guide - string_builder.test.coffee
Copyright (c) 2015 by Redwood Labs
All rights reserved.
###
StringBuilder = require '../models/string_builder'
########################################################################################################################
builder = null
########################################################################################################################
describe 'string_builder.coffee', ->
beforeEach -> builder = new StringBuilder
describe 'call', ->
it 'works with no arguments', ->
builder.call (b)-> b.push 'foo'
builder.toString().should.equal 'foo'
it 'works with multiple arguments', ->
builder.call 'foo', 'bar', 'baz', (builder, a, b, c)-> builder.loop [a, b, c]
builder.toString().should.equal 'foo, bar, baz'
describe 'loop', ->
it 'can make an empty list', ->
builder.loop [], start:'[', end:']'
builder.toString().should.equal '[]'
it 'can make a list with a single element', ->
builder.loop ['foo'], start:'[', end:']'
builder.toString().should.equal '[foo]'
it 'can make a list with many elements', ->
builder.loop ['foo', 'bar', 'baz'], start:'[', end:']'
builder.toString().should.equal '[foo, bar, baz]'
it 'can make a list with a custom callback', ->
builder.loop ['foo', 'bar', 'baz'], start:'[', end:']', onEach:(b, i)-> b.push "\"#{i}\""
builder.toString().should.equal '["foo", "bar", "baz"]'
it 'can use a custom delimiter', ->
builder.loop ['foo', 'bar', 'baz'], delimiter:'|'
builder.toString().should.equal 'foo|bar|baz'
it 'can indent content', ->
builder.loop ['foo', 'bar', 'baz'], start:'[\n', end:'\n]', delimiter:',\n', indent:true
builder.toString().should.equal '[\n foo,\n bar,\n baz\n]'
describe 'onlyIf', ->
it 'calls the callback on true', ->
builder.onlyIf true, (b)-> b.push 'foo'
builder.toString().should.equal 'foo'
describe 'push', ->
it 'can build a simple string', ->
builder.push('foo').push(' bar').push(' baz')
builder.toString().should.equal 'foo bar baz'
it 'can build a multi-line string', ->
builder.push('foo').push('\nbar\n').push('baz')
builder.toString().should.equal 'foo\nbar\nbaz'
it 'can build an indented multi-line string', ->
builder
.push 'foo\n'
.indent()
.push 'bar\n'
.outdent()
.push 'baz'
builder.toString().should.equal 'foo\n bar\nbaz'
it 'can pick apart multiple newlines in a single chunk', ->
builder.indent().push('foo\nbar\nbaz').outdent().push('\nbif')
builder.toString().should.equal 'foo\n bar\n baz\nbif'
-45
View File
@@ -1,45 +0,0 @@
###
# Crafting Guide - test.coffee
#
# Copyright (c) 2014-2015 by Redwood Labs
# All rights reserved.
###
# Test Set-up ##########################################################################################################
chai.use require 'sinon-chai'
chai.config.includeStack = true
if typeof(global) is 'undefined'
window.global = window
global.assert = chai.assert
global.expect = chai.expect
global.should = chai.should()
global.util = require 'util'
Logger = require '../logger'
global.logger = new Logger level:Logger.DEBUG
require '../polyfill'
require '../underscore_mixins'
# Test Registry ########################################################################################################
mocha.setup 'bdd'
# tests are roughly in order of how errors should be tackled
require './string_builder.test'
require './item_slug.test'
require './inventory.test'
require './recipe.test'
require './mod_version.test'
require './mod.test'
require './mod_pack.test'
require './parser_versions/command_parser_version_base.test'
require './parser_versions/mod_version_parser_v1.test'
require './crafting_plan.test'
mocha.checkLeaks()
mocha.globals ['LiveReload']
mocha.run()
+2 -2
View File
@@ -32,5 +32,5 @@
.action
iframe(src="http://ghbtns.com/github-btn.html?user=andrewminer&repo=crafting-guide&type=fork&size=large",
allowtransparency="true", frameborder="0", scrolling="0", width="100", height="32")
a(href="/test.html", rel="nofollow")
.divider.bottom
.divider.bottom
-35
View File
@@ -1,35 +0,0 @@
//-
//- Crafting Guide - test.jade
//-
//- Copyright (c) 2014-2015 by Redwood Labs
//- All rights reserved.
//-
doctype html
html
head
title Crafting Guide Unit Tests
meta(charset="UTF-8")
link(href="/images/favicon.png", rel="icon", type="image/png")
block styles
link(rel="stylesheet", type="text/css", href="/css/main.css")
link(rel="stylesheet", type="text/css", href="css/mocha.css")
style #mocha-stats { position: absolute; top: 12em; }
body
block body
.view__feedback
.view__screen
.content
include ./includes/_header.jade
.page
#mocha
include ./includes/_footer.jade
block scripts
include ./includes/_standard_scripts.jade
script(src="/js/mocha.js")
script(src="/js/chai.js")
script(src="/js/test.js")
@@ -5,11 +5,11 @@ Copyright (c) 2014-2015 by Redwood Labs
All rights reserved.
###
CraftingPlan = require '../models/crafting_plan'
ItemSlug = require '../models/item_slug'
Mod = require '../models/mod'
ModPack = require '../models/mod_pack'
ModVersion = require '../models/mod_version'
CraftingPlan = require '../src/coffee/models/crafting_plan'
ItemSlug = require '../src/coffee/models/item_slug'
Mod = require '../src/coffee/models/mod'
ModPack = require '../src/coffee/models/mod_pack'
ModVersion = require '../src/coffee/models/mod_version'
########################################################################################################################
@@ -5,11 +5,11 @@
# All rights reserved.
###
{Event} = require '../constants'
{Event} = require '../src/coffee/constants'
EventRecorder = require './event_recorder'
Inventory = require '../models/inventory'
Item = require '../models/item'
ItemSlug = require '../models/item_slug'
Inventory = require '../src/coffee/models/inventory'
Item = require '../src/coffee/models/item'
ItemSlug = require '../src/coffee/models/item_slug'
########################################################################################################################
@@ -5,7 +5,7 @@ Copyright (c) 2015 by Redwood Labs
All rights reserved.
###
ItemSlug = require '../models/item_slug'
ItemSlug = require '../src/coffee/models/item_slug'
########################################################################################################################
@@ -5,7 +5,7 @@ Copyright (c) 2015 by Redwood Labs
All rights reserved.
###
Mod = require '../models/mod'
Mod = require '../src/coffee/models/mod'
########################################################################################################################
@@ -5,11 +5,11 @@ Copyright (c) 2014-2015 by Redwood Labs
All rights reserved.
###
Item = require '../models/item'
ItemSlug = require '../models/item_slug'
Mod = require '../models/mod'
ModPack = require '../models/mod_pack'
ModVersion = require '../models/mod_version'
Item = require '../src/coffee/models/item'
ItemSlug = require '../src/coffee/models/item_slug'
Mod = require '../src/coffee/models/mod'
ModPack = require '../src/coffee/models/mod_pack'
ModVersion = require '../src/coffee/models/mod_version'
########################################################################################################################
@@ -5,9 +5,9 @@ Copyright (c) 2014-2015 by Redwood Labs
All rights reserved.
###
Item = require '../models/item'
ItemSlug = require '../models/item_slug'
ModVersion = require '../models/mod_version'
Item = require '../src/coffee/models/item'
ItemSlug = require '../src/coffee/models/item_slug'
ModVersion = require '../src/coffee/models/mod_version'
########################################################################################################################
@@ -92,5 +92,5 @@ describe 'mod_version.coffee', ->
"""
it 'finds all recipes which list item as output', ->
recipes = modVersion.findRecipes ItemSlug.slugify('Bucket')
recipes = modVersion.findRecipes ItemSlug.slugify('test__bucket')
(r.output[0].itemSlug.item for r in recipes).sort().should.eql ['bucket', 'cake', 'cake']
@@ -5,7 +5,7 @@ Copyright (c) 2015 by Redwood Labs
All rights reserved.
###
CommandParserVersionBase = require '../../models/parser_versions/command_parser_version_base'
CommandParserVersionBase = require '../../src/coffee/models/parser_versions/command_parser_version_base'
########################################################################################################################
@@ -5,10 +5,11 @@ Copyright (c) 2015 by Redwood Labs
All rights reserved.
###
CommandParserVersionBase = require '../../models/parser_versions/command_parser_version_base'
ItemSlug = require '../../models/item_slug'
ModVersion = require '../../models/mod_version'
ModVersionParserV1 = require '../../models/parser_versions/mod_version_parser_v1'
CommandParserVersionBase = require '../../src/coffee/models/parser_versions/command_parser_version_base'
ItemSlug = require '../../src/coffee/models/item_slug'
ModVersion = require '../../src/coffee/models/mod_version'
ModVersionParserV1 = require '../../src/coffee/models/parser_versions/mod_version_parser_v1'
{Logger} = require 'crafting-guide-common'
########################################################################################################################
@@ -29,7 +30,7 @@ describe 'mod_version_parser_v1.coffee', ->
recipe:; input:Alpha; pattern:... .0. ...;
recipe:; input:Bravo; pattern:... 0.0 ...;"
modVersion = parser.parse recipes
recipes = modVersion.findRecipes ItemSlug.slugify 'charlie'
recipes = modVersion.findRecipes ItemSlug.slugify 'test__charlie'
recipes[0].input[0].itemSlug.qualified.should.equal 'alpha'
recipes[1].input[0].itemSlug.qualified.should.equal 'bravo'
@@ -68,9 +69,10 @@ describe 'mod_version_parser_v1.coffee', ->
describe 'input', ->
it 'adds "input" when present', ->
modVersion = parser.parse baseText + 'recipe:; input:Alpha, Bravo, Charlie; pattern: ... 012 ...'
slugs = (s.itemSlug.item for s in modVersion.findRecipes(ItemSlug.slugify('charlie'))[0].input)
slugs.should.eql ['alpha', 'bravo', 'charlie']
logger.doAtLevel 'DEBUG', ->
modVersion = parser.parse baseText + 'recipe:; input:Alpha, Bravo; pattern: ... 010 ...'
slugs = (s.itemSlug.item for s in modVersion.findRecipes(ItemSlug.slugify('test__charlie'))[0].input)
slugs.should.eql ['alpha', 'bravo']
it 'requires an "input" declaration', ->
func = -> parser.parse baseText + 'recipe:; pattern: ... .0. ...'
@@ -92,7 +94,7 @@ describe 'mod_version_parser_v1.coffee', ->
it 'adds "pattern" when present', ->
modVersion = parser.parse baseText + 'recipe:; input:Alpha, Bravo; pattern:... .0. .1.'
modVersion.findRecipes(ItemSlug.slugify('charlie'))[0].pattern.should.equal '... .0. .1.'
modVersion.findRecipes(ItemSlug.slugify('test__charlie'))[0].pattern.should.equal '... .0. .1.'
it 'requires a "pattern" declaration', ->
func = -> parser.parse baseText + 'recipe:; input:Alpha, Bravo'
@@ -119,8 +121,8 @@ describe 'mod_version_parser_v1.coffee', ->
expect(func).to.throw Error, 'Bravo is an input'
it 'computes the input stack sizes from the pattern', ->
modVersion = parser.parse baseText + 'recipe:; input:Alpha, Bravo, Charlie; pattern:111 .0. 2.2'
recipe = modVersion.findRecipes(ItemSlug.slugify('charlie'))[0]
modVersion = parser.parse baseText + 'recipe:; input:Alpha, Bravo, Delta; pattern:111 .0. 2.2'
recipe = modVersion.findRecipes(ItemSlug.slugify('test__charlie'))[0]
recipe.input[0].quantity.should.equal 1
recipe.input[1].quantity.should.equal 3
recipe.input[2].quantity.should.equal 2
@@ -136,7 +138,7 @@ describe 'mod_version_parser_v1.coffee', ->
it 'adds "quantity" when present', ->
modVersion = parser.parse baseText + 'quantity: 2'
modVersion.findRecipes(ItemSlug.slugify('charlie'))[0].output[0].quantity.should.equal 2
modVersion.findRecipes(ItemSlug.slugify('test__charlie'))[0].output[0].quantity.should.equal 2
it 'does not allow a duplicate "quantity" declaration', ->
func = -> parser.parse baseText + 'quantity:1; quantity:2'
@@ -148,7 +150,7 @@ describe 'mod_version_parser_v1.coffee', ->
it 'assumes a quantity of 1 by default', ->
modVersion = parser.parse baseText
modVersion.findRecipes(ItemSlug.slugify('charlie'))[0].output[0].quantity.should.equal 1
modVersion.findRecipes(ItemSlug.slugify('test__charlie'))[0].output[0].quantity.should.equal 1
it 'does not allow "quantity" before recipe', ->
func = -> parser.parse 'item:Bravo; quantity:12; recipe:;'
@@ -161,13 +163,13 @@ describe 'mod_version_parser_v1.coffee', ->
it 'adds a single item as the default output', ->
modVersion = parser.parse baseText
stack = modVersion.findRecipes(ItemSlug.slugify('bravo'))[0].output[0]
stack = modVersion.findRecipes(ItemSlug.slugify('test__bravo'))[0].output[0]
stack.itemSlug.qualified.should.equal 'test__bravo'
stack.quantity.should.equal 1
it 'can add multiple extras with quantities', ->
modVersion = parser.parse baseText + 'extras:2 Delta, 4 Echo'
output = modVersion.findRecipes(ItemSlug.slugify('bravo'))[0].output
output = modVersion.findRecipes(ItemSlug.slugify('test__bravo'))[0].output
output[0].itemSlug.qualified.should.equal 'test__bravo'
output[0].quantity.should.equal 1
output[1].itemSlug.qualified.should.equal 'test__delta'
@@ -196,11 +198,11 @@ describe 'mod_version_parser_v1.coffee', ->
it 'can add a single tool', ->
modVersion = parser.parse baseText + 'tools: Furnace'
modVersion.findRecipes(ItemSlug.slugify('bravo'))[0].tools[0].itemSlug.item.should.equal 'furnace'
modVersion.findRecipes(ItemSlug.slugify('test__bravo'))[0].tools[0].itemSlug.item.should.equal 'furnace'
it 'can add multiple tools', ->
modVersion = parser.parse baseText + 'tools: Crafting Table, Furnace'
tools = modVersion.findRecipes(ItemSlug.slugify('bravo'))[0].tools
tools = modVersion.findRecipes(ItemSlug.slugify('test__bravo'))[0].tools
tools[0].itemSlug.item.should.equal 'crafting_table'
tools[1].itemSlug.item.should.equal 'furnace'
@@ -5,10 +5,10 @@ Copyright (c) 2015 by Redwood Labs
All rights reserved.
###
Item = require '../models/item'
ItemSlug = require '../models/item_slug'
Recipe = require '../models/recipe'
Stack = require '../models/stack'
Item = require '../src/coffee/models/item'
ItemSlug = require '../src/coffee/models/item_slug'
Recipe = require '../src/coffee/models/recipe'
Stack = require '../src/coffee/models/stack'
########################################################################################################################
+26
View File
@@ -0,0 +1,26 @@
###
# Crafting Guide - test.coffee
#
# Copyright (c) 2014-2015 by Redwood Labs
# All rights reserved.
###
# Test Set-up ##########################################################################################################
chai = require 'chai'
chai.use require 'sinon-chai'
chai.config.includeStack = true
global._ = require 'underscore'
global.Backbone = require 'backbone'
global.assert = chai.assert
global.expect = chai.expect
global.should = chai.should()
global.util = require 'util'
global.w = require 'when'
{Logger} = require 'crafting-guide-common'
global.logger = new Logger level:Logger.FATAL
require '../src/coffee/polyfill'
require '../src/coffee/underscore_mixins'