codo
Version:
A CoffeeScript documentation generator.
131 lines (110 loc) • 5.66 kB
text/coffeescript
FS = require 'fs'
jsdiff = require 'diff'
Path = require 'path'
walkdir = require 'walkdir'
Environment = require '../../lib/environment'
normalizePathsInObject = (obj) ->
return if typeof obj is "string"
if obj.file? then obj.file = Path.normalize obj.file
for key, val of obj # ['variables', 'methods', 'properties', 'includes', 'container', 'parent', 'extends']
if Array.isArray val
val.forEach normalizePathsInObject
else normalizePathsInObject obj[key]
beforeEach ->
toTraverseTo: (expected) ->
environment = new Environment
parser = environment.readCoffee()
environment.linkify()
actual = JSON.parse JSON.stringify environment.inspect()
expected = JSON.parse FS.readFileSync(expected, 'utf8')
expected.forEach (entry) -> normalizePathsInObject entry
diff = ""
for part in jsdiff.diffJson(expected, actual)
if part.added
diff += part.value.green
else if part.removed
diff += part.value.red
else
diff += part.value
diff
= ->
report = "\n-------------------- CoffeeScript ----------------------\n"
report += parser.content
report += "\n--------------------- JSON diff -----------------------\n"
report += diff
report += "\n-------------------------------------------------------\n"
require('deep-eql')(expected, actual)
describe 'Environment', ->
describe 'Extras', ->
beforeEach -> = new Environment
it 'reads plain text', ->
.readExtra 'spec/_templates/extras/README'
expect(.allExtras().map (e) -> e.inspect()).toEqual([{
path: 'spec/_templates/extras/README',
parsed: '<p>This is a test README</p>'
}])
it 'reads markdown', ->
.readExtra 'spec/_templates/extras/README.md'
expect(.allExtras().map (e) -> e.inspect()).toEqual([{
path: 'spec/_templates/extras/README.md',
parsed: '<h1 id="this-is-a-test-readme">This is a test README</h1><p>We even have some content here. <a href="http://github.com">With links!</a></p><h2 id="and-nested-menus">And nested menus</h2><p>And even more content</p><h3 id="actually-">Actually...</h3><p>I feel terribly sick writing this. It's like talking to myself.</p>'
parsed: '<h1 id="this-is-a-test-readme">This is a test README</h1><p>We even have some content here. <a href="http://github.com">With links!</a></p><h2 id="and-nested-menus">And nested menus</h2><p>And even more content</p><h3 id="actually-">Actually...</h3><p>I feel terribly sick writing this. It's like talking to myself.</p><p><a href="SomeOtherFile.md.html">With relative markdown links too</a></p>'
}])
describe 'Class', ->
for filename in walkdir.sync './spec/_templates/classes' when filename.match /\.coffee$/
do (filename) ->
it "parses #{filename}", ->
expect(filename.substring process.cwd().length + 1)
.toTraverseTo(filename.replace(/\.coffee$/, '.json'))
describe 'Variable', ->
for filename in walkdir.sync './spec/_templates/variables' when filename.match /\.coffee$/
do (filename) ->
it "parses #{filename}", ->
expect(filename.substring process.cwd().length + 1)
.toTraverseTo(filename.replace(/\.coffee$/, '.json'))
describe 'Property', ->
for filename in walkdir.sync './spec/_templates/properties' when filename.match /\.coffee$/
do (filename) ->
it "parses #{filename}", ->
expect(filename.substring process.cwd().length + 1)
.toTraverseTo(filename.replace(/\.coffee$/, '.json'))
describe 'File', ->
it 'parses non-class file', ->
expect(Path.normalize 'spec/_templates/files/non_class_file.coffee').toTraverseTo(
'spec/_templates/files/non_class_file.json'
)
describe 'Mixin', ->
for filename in walkdir.sync './spec/_templates/mixins' when filename.match /\.coffee$/
do (filename) ->
it "parses #{filename}", ->
expect(filename.substring process.cwd().length + 1)
.toTraverseTo(filename.replace(/\.coffee$/, '.json'))
describe 'Method', ->
for filename in walkdir.sync './spec/_templates/methods' when filename.match /\.coffee$/
do (filename) ->
it "parses #{filename}", ->
expect(filename.substring process.cwd().length + 1)
.toTraverseTo(filename.replace(/\.coffee$/, '.json'))
describe 'Angular', ->
for filename in walkdir.sync './spec/_templates/angular' when filename.match /\.coffee$/
do (filename) ->
it "parses #{filename}", ->
expect(filename.substring process.cwd().length + 1)
.toTraverseTo(filename.replace(/\.coffee$/, '.json'))
describe 'Environment', ->
it 'handles multiple files', ->
environment = Environment.read [
'spec/_templates/environment/class.coffee',
'spec/_templates/environment/mixin.coffee'
].map Path.normalize
actual = JSON.stringify(environment.inspect(), null, 2)
expected = JSON.parse FS.readFileSync 'spec/_templates/environment/result.json', 'utf8'
expected.forEach normalizePathsInObject
expected = JSON.stringify expected, null, 2
expect(actual).toEqual expected
expect(Object.keys environment.references).toEqual [
'spec/_templates/environment/class.coffee',
'spec/_templates/environment/mixin.coffee',
'Fluffy', 'LookAndFeel', 'LookAndFeel~feel', 'LookAndFeel~look'
].map Path.normalize