const assert = require('assert')
const { readFileSync } = require('fs')

const {
  readFileAsync,
  callThreadsafeFunction,
  withAbortController,
} = require('./index')

const FILE_CONTENT = readFileSync(__filename, 'utf8')

async function main() {
  const ctrl = new AbortController()
  const promise = withAbortController(1, 2, ctrl.signal)
  try {
    ctrl.abort()
    await promise
    throw new Error('Should throw AbortError')
  } catch (err) {
    assert(err.message === 'AbortError')
  }

  const buf = await readFileAsync(__filename)
  assert(FILE_CONTENT === buf.toString('utf8'))

  const value = await new Promise((resolve, reject) => {
    let i = 0
    let value = 0
    callThreadsafeFunction((err, v) => {
      if (err != null) {
        reject(err)
        return
      }
      i++
      value += v
      if (i === 100) {
        resolve(value)
      }
    })
  })

  assert(
    value ===
      Array.from({ length: 100 }, (_, i) => i + 1).reduce((a, b) => a + b),
  )
  process.exit(0)
}

main().catch((e) => {
  console.error(e)
  process.exit(1)
})