var path = require('path')
var fs = require('fs')
var spawn = require('child_process').spawn
var t = require('tap')
var node = process.execPath
var wrap = require.resolve('./fixtures/wrap.js')
var rimraf = require('rimraf')
var mkdirp = require('mkdirp')
var fs = require('fs')

if (process.platform === 'win32') {
  t.plan(0, 'No proper shebang support on windows, so skip this')
  process.exit(0)
}

var expect =
  'before in shim\n' +
  'shebang main foo,bar\n' +
  'after in shim\n' +
  'before in shim\n' +
  'shebang main foo,bar\n' +
  'after in shim\n'

var fixdir = path.resolve(__dirname, 'fixtures', 'shebangs')

t.test('setup', function (t) {
  rimraf.sync(fixdir)
  mkdirp.sync(fixdir)
  t.end()
})

t.test('absolute', function (t) {
  var file = path.resolve(fixdir, 'absolute.js')
  runTest(file, process.execPath, t)
})

t.test('env', function (t) {
  var file = path.resolve(fixdir, 'env.js')
  runTest(file, '/usr/bin/env node', t)
})

function runTest (file, shebang, t) {
  var content = '#!' + shebang + '\n' +
    'console.log("shebang main " + process.argv.slice(2))\n'
  fs.writeFileSync(file, content, 'utf8')
  fs.chmodSync(file, '0755')
  var child = spawn(node, [wrap, file, 'foo', 'bar'])
  var out = ''
  var err = ''
  child.stdout.on('data', function (c) {
    out += c
  })
  child.stderr.on('data', function (c) {
    err += c
  })
  child.on('close', function (code,  signal) {
    t.equal(code, 0)
    t.equal(signal, null)
    t.equal(out, expect)
    // console.error(err)
    t.end()
  })
}

t.test('cleanup', function (t) {
  rimraf.sync(fixdir)
  t.end()
})