docopt
Version:
a command line option parser that will make you smile
64 lines (56 loc) • 1.98 kB
text/coffeescript
assert = require 'assert'
path = require 'path'
fs = require 'fs'
docopt = require '../docopt.coffee'
partition = (text, delimiter) ->
parts = text.split delimiter
return [parts[0], delimiter, parts[1..].join(delimiter)]
load_test_cases = () ->
testcases_path = path.resolve './test/testcases.docopt'
if fs.existsSync testcases_path
try
return fs.readFileSync(testcases_path).toString()
catch err
return console.error "Could not read ./test/testcases.docopt file"
else
return console.error "./test/testcases.docopt not exists"
parse_test = (raw) ->
raw = raw.replace(/#.*/gm, '').trim()
if (raw.indexOf '"""') is 0
raw = raw[3..]
tests = []
for fixture in raw.split('r"""')
name = ''
[doc, _, body] = partition fixture, '"""'
cases = []
for mycase in body.split('$')[1..]
[argv, _, expect] = partition mycase.trim(), '\n'
expect = JSON.parse(expect)
[prog, _, argv] = partition argv.trim(), ' '
cases.push([prog, argv, expect])
tests.push [name, doc, cases]
return tests
collect = () ->
index = 1
collected = []
testcases = load_test_cases()
for [name, doc, cases] in parse_test testcases
name = 'testcases.docopt'
for mycase in cases
collected.push [[name, index], doc, mycase]
index++
return collected
describe 'testcases.coffee', ->
collected = collect()
collected.forEach (c) ->
[test_file, index] = c[0]
doc = c[1]
[prog, argv, expected] = c[2]
it "testcase #{index} `#{[prog, argv].join(' ')}`", ->
try
result = docopt.docopt(doc, {name: prog, argv: argv, exit: false})
catch e
if e.constructor is docopt.DocoptExit
result = 'user-error'
finally
assert.deepEqual result, expected