'use strict'

const tap = require('tap')
const silentConsole = {
  log() {},
  error() {}
}
const common = require('../common')
const { Duplex } = require('../../lib/ours/index')
const assert = require('assert')
{
  const duplex = new Duplex({
    readable: false
  })
  assert.strictEqual(duplex.readable, false)
  duplex.push('asd')
  duplex.on(
    'error',
    common.mustCall((err) => {
      assert.strictEqual(err.code, 'ERR_STREAM_PUSH_AFTER_EOF')
    })
  )
  duplex.on('data', common.mustNotCall())
  duplex.on('end', common.mustNotCall())
}
{
  const duplex = new Duplex({
    writable: false,
    write: common.mustNotCall()
  })
  assert.strictEqual(duplex.writable, false)
  duplex.write('asd')
  duplex.on(
    'error',
    common.mustCall((err) => {
      assert.strictEqual(err.code, 'ERR_STREAM_WRITE_AFTER_END')
    })
  )
  duplex.on('finish', common.mustNotCall())
}
{
  const duplex = new Duplex({
    readable: false
  })
  assert.strictEqual(duplex.readable, false)
  duplex.on('data', common.mustNotCall())
  duplex.on('end', common.mustNotCall())
  async function run() {
    for await (const chunk of duplex) {
      assert(false, chunk)
    }
  }
  run().then(common.mustCall())
}

/* replacement start */
process.on('beforeExit', (code) => {
  if (code === 0) {
    tap.pass('test succeeded')
  } else {
    tap.fail(`test failed - exited code ${code}`)
  }
})
/* replacement end */
