Skip to content

Instantly share code, notes, and snippets.

@joyrexus
Last active December 14, 2015 19:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save joyrexus/5133879 to your computer and use it in GitHub Desktop.
Save joyrexus/5133879 to your computer and use it in GitHub Desktop.
Simple test task and runner for your Cake files.
task 'test', 'run the test suite', ->
runTests()
# Simple test runner, ripped from the docco Cake file.
runTests = ->
global.Main = require './main' # rename/require module to be tested
require 'coffee-script'
startTime = Date.now()
currentFile = null
currentTest = null
currentSource = null
passedTests = 0
passedAssert = 0
failedAssert = 0
failures = []
done = false
# Wrap each assert function in a try/catch block to report passed/failed assertions.
wrapAssert = (func,name) ->
return ->
try
result = func.apply this, arguments
++passedAssert
catch e
++failedAssert
e.description = arguments[2] if arguments.length == 3
e.source = currentSource
e.testName = currentTest
failures.push
filename: currentFile
error: e
result
global[name] = wrapAssert(func,name) for name, func of require 'assert'
# Our test helper function for delimiting different test cases.
global.test = (description, fn) ->
try
fn.test = {description, currentFile}
currentTest = description
currentSource = fn.toString() if fn.toString?
fn.call(fn)
++passedTests
catch e
e.testName = currentTest
e.description = description if description?
e.source = fn.toString() if fn.toString?
failures.push filename: currentFile, error: e
# When all the tests have run, collect and print errors.
# If a stacktrace is available, output the compiled function source.
process.on 'exit', ->
return if done
done = true
time = ((Date.now() - startTime) / 1000).toFixed(2)
for fail in failures
{error, filename} = fail
jsFilename = filename.replace(/\.coffee$/,'.js')
match = error.stack?.match(new RegExp(fail.filename+":(\\d+):(\\d+)"))
match = error.stack?.match(/on line (\d+):/) unless match
[match, line, col] = match if match
console.log "\n--------------------------------------------------------"
console.log " FAILED: #{error.testName}\n" if error.testName
console.log " FILE :#{jsFilename}: line #{line ? 'unknown'}, column #{col ? 'unknown'}"
console.log " ERROR : #{error.description}" if error.description
console.log " STACK : #{error.stack}" if error.stack
console.log " SOURCE: #{error.source}" if error.source
console.log "--------------------------------------------------------"
console.log "Testing completed in #{time} seconds"
console.log " #{passedTests} tests passed, #{failures.length} failed"
console.log " #{passedAssert} asserts passed, #{failedAssert} failed"
console.log "--------------------------------------------------------"
process.exit if failures.length > 0 then 1 else 0
# Run every test in the `test` folder, recording failures.
files = fs.readdirSync 'test'
for file in files when file.match /\.coffee$/i
currentFile = filename = path.join 'test', file
code = fs.readFileSync filename
try
CoffeeScript.run code.toString(), {filename}
catch error
error.description = currentTest
failures.push {filename, error}
return !failures.length
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment