var test = require('tap').test var inf = require('./inflight.js')

function req (key, cb) {

cb = inf(key, cb)
if (cb) setTimeout(function () {
  cb(key)
  cb(key)
})
return cb

}

test('basic', function (t) {

var calleda = false
var a = req('key', function (k) {
  t.notOk(calleda)
  calleda = true
  t.equal(k, 'key')
  if (calledb) t.end()
})
t.ok(a, 'first returned cb function')

var calledb = false
var b = req('key', function (k) {
  t.notOk(calledb)
  calledb = true
  t.equal(k, 'key')
  if (calleda) t.end()
})

t.notOk(b, 'second should get falsey inflight response')

})

test('timing', function (t) {

var expect = [
  'method one',
  'start one',
  'end one',
  'two',
  'tick',
  'three'
]
var i = 0

function log (m) {
  t.equal(m, expect[i], m + ' === ' + expect[i])
  ++i
  if (i === expect.length)
    t.end()
}

function method (name, cb) {
  log('method ' + name)
  process.nextTick(cb)
}

var one = inf('foo', function () {
  log('start one')
  var three = inf('foo', function () {
    log('three')
  })
  if (three) method('three', three)
  log('end one')
})

method('one', one)

var two = inf('foo', function () {
  log('two')
})
if (two) method('one', two)

process.nextTick(log.bind(null, 'tick'))

})

test('parameters', function (t) {

t.plan(8)

var a = inf('key', function (first, second, third) {
  t.equal(first, 1)
  t.equal(second, 2)
  t.equal(third, 3)
})
t.ok(a, 'first returned cb function')

var b = inf('key', function (first, second, third) {
  t.equal(first, 1)
  t.equal(second, 2)
  t.equal(third, 3)
})
t.notOk(b, 'second should get falsey inflight response')

setTimeout(function () {
  a(1, 2, 3)
})

})