import test from 'ava'

const bindings = require('../index.node')

test('instanceof', (t) => {
  const day = new Date()
  t.true(bindings.instanceof(day, Date))
  t.false(bindings.instanceof(day, Number))
  t.false(bindings.instanceof(1, Date))
})

test('is_error', (t) => {
  t.true(bindings.isError(new Error()))
  t.true(bindings.isError(new TypeError()))
  t.true(bindings.isError(new SyntaxError()))
  t.false(bindings.isError('111'))
  t.false(bindings.isError(2))
  t.false(bindings.isError(Symbol()))
})

test('is_typedarray', (t) => {
  t.true(bindings.isTypedarray(new Uint8Array()))
  t.true(bindings.isTypedarray(new Uint16Array()))
  t.true(bindings.isTypedarray(new Uint32Array()))
  t.true(bindings.isTypedarray(new Int8Array()))
  t.true(bindings.isTypedarray(new Int16Array()))
  t.true(bindings.isTypedarray(new Int32Array()))
  t.true(bindings.isTypedarray(Buffer.from('123')))
  t.false(bindings.isTypedarray(Buffer.from('123').buffer))
  t.false(bindings.isTypedarray([]))
})

test('is_dataview', (t) => {
  const data = new Uint8Array(100)
  t.true(bindings.isDataview(new DataView(data.buffer)))
  t.false(bindings.isDataview(Buffer.from('123')))
})

test('strict_equals', (t) => {
  const a = {
    foo: 'bar',
  }
  const b = { ...a }
  t.false(bindings.strictEquals(a, b))
  t.false(bindings.strictEquals(1, '1'))
  t.false(bindings.strictEquals(null, undefined))
  t.false(bindings.strictEquals(NaN, NaN))
  t.true(bindings.strictEquals(a, a))
})

test('cast_unknown', (t) => {
  const f = {}
  const r = bindings.castUnknown(f)
  t.is(f, r)
})

test('cast_unknown will not throw', (t) => {
  const f = 1
  t.notThrows(() => bindings.castUnknown(f))
})