var assert = require('assert')
  , ref = require('ref')
  , ffi = require('../')

describe('ffi_cif', function () {

  afterEach(gc)

  it('should return a Buffer representing the `ffi_cif` instance', function () {
    var cif = ffi.CIF(ref.types.void, [ ])
    assert(Buffer.isBuffer(cif))
  })

  it('should throw an Error when given an invalid "type"', function () {
    var ffi_type = new ffi.FFI_TYPE
    ffi_type.size = 0
    ffi_type.alignment = 0
    ffi_type.type = 0
    ffi_type.elements = ref.NULL

    var bad_type = { size: 1, indirection: 1, ffi_type: ffi_type.ref() }
    assert.throws(function () {
      ffi.CIF(bad_type, [])
    }, function (err) {
      assert(err.message.indexOf('FFI_BAD_TYPEDEF') !== -1)
      assert.equal('FFI_BAD_TYPEDEF', err.code)
      assert.equal(ffi.FFI_BAD_TYPEDEF, err.errno)
      return true
    })
  })

  it('should throw an Error when given an invalid ABI argument', function () {
    assert.throws(function () {
      ffi.CIF(ref.types.void, [], -1)
    }, function (err) {
      assert(err.message.indexOf('FFI_BAD_ABI') !== -1)
      assert.equal('FFI_BAD_ABI', err.code)
      assert.equal(ffi.FFI_BAD_ABI, err.errno)
      return true
    })
  })

})