fs = require "fs"
pathLib = require "path"

format = (code) ->
  trailingNewline = /(\n|\r)+$/
  leadingWhitespace = /(\n|\r)\s+/g
  out = code.replace(trailingNewline, "").replace(leadingWhitespace, "\n")
  "\n#{out}\n"

global.expectSourceToMatch = (dropOrSource, content) ->
  actual = error = null
  if dropOrSource.source
    waitsFor -> dropOrSource.paths.length > 0
    runs ->
      dropOrSource.source((err, data) ->
        error = err
        actual = data
      )
  else
    actual = dropOrSource

  waitsFor ->
    actual || error
  runs ->
    throw error if error
    expect(format(actual)).toEqual format(content)

global.expectSourceToMatchFile = (drop, filename) ->
  content = fs.readFileSync(filename).toString()
  expectSourceToMatch drop, content

fs.readdirSync("#{__dirname}/fixtures/modules").forEach (name) ->
  src = "#{__dirname}/fixtures/modules/#{name}"
  des = "#{__dirname}/../node_modules/#{name}"
  unless pathLib.existsSync des
    fs.linkSync src, des
