# tests.coffee

¶

    {spawn, exec} = require 'child_process'
    path          = require 'path'
    fs            = require 'fs'

¶

Determine the test and resources paths

    testPath      = path.dirname fs.realpathSync(__filename)
    dataPath      = path.join testPath, "data"
    resourcesPath = path.normalize path.join(testPath,"/../resources")

¶

Run a Docco pass and check that the number of output files is equal to what is expected.

    testDoccoRun = (testName,sources,options=null,callback=null) ->
      destPath = path.join dataPath, testName
      cleanup = (callback) -> exec "rm -rf #{destPath}", callback
      cleanup ->
        options?.output = destPath
        Docco.document sources, options, ->
          files       = []
          files       = files.concat(Docco.resolveSource(src)) for src in sources
          expected    = files.length + 1
          found       = fs.readdirSync(destPath).length
          eq found, expected, "find expected output (#{expected} files) - (#{found})"
          callback() if callback?

¶

Custom jst template files should be supported

    test "custom JST template file", ->
      testDoccoRun "custom_jst",
        ["#{testPath}/*.coffee"],
        template: "#{resourcesPath}/pagelet.jst"

¶

Custom CSS files should be supported

    test "custom CSS file", ->
      testDoccoRun "custom_css",
        ["#{testPath}/*.coffee"],
        css: "#{resourcesPath}/pagelet.css"

¶

Comments should be parsed properly

There are special data files located in `test/comments` for each supported language. The first comment in each file corresponds to the expected number of comments to be parsed from its contents.

This test iterates over all the known Docco languages, and tests the ones that have a corresponding data file in `test/comments`.

    test "single line comment parsing", ->
      commentsPath = path.join testPath, "comments"
      options           = template: "#{commentsPath}/comments.jst"
      languageKeys = (ext for ext,l of Docco.languages)

      testNextLanguage = (keys,callback) ->
        return callback?() if not keys.length

        extension       = keys.shift()
        language        = Docco.languages[extension]
        languageExample = path.join commentsPath, "#{language.name}#{extension}"
        languageTest    = "comments_test/#{language.name}"
        languagePath    = path.join dataPath, languageTest
        languageOutput  = path.join languagePath, "#{language.name}.html"

¶

Skip over this language if there is no corresponding test

        return testNextLanguage(keys, callback) if not path.existsSync languageExample

        testDoccoRun languageTest, [languageExample], options, ->
          eq true, path.existsSync(languageOutput), "#{languageOutput} -> output file created properly"

          content = fs.readFileSync(languageOutput).toString()
          comments = (c.trim() for c in content.split(',') when c.trim() != '')

          eq true, comments.length >= 1, 'expect at least the descriptor comment'

          expected = parseInt(comments[0])

          eq comments.length, expected, [
            ""
            "#{path.basename(languageOutput)} comments"
            "------------------------"
            " expected : #{expected}"
            " found    : #{comments.length}"
          ].join '\n'

          testNextLanguage keys, callback

¶

Kick off the first language test

      testNextLanguage languageKeys.slice()