'use strict'

const tap = require('tap')
const silentConsole = {
  log() {},
  error() {}
}
const common = require('../common')
const assert = require('assert')
const { Readable, Writable } = require('../../lib/ours/index')

// This test ensures that if have 'readable' listener
// on Readable instance it will not disrupt the pipe.

{
  let receivedData = ''
  const w = new Writable({
    write: (chunk, env, callback) => {
      receivedData += chunk
      callback()
    }
  })
  const data = ['foo', 'bar', 'baz']
  const r = new Readable({
    read: () => {}
  })
  r.once('readable', common.mustCall())
  r.pipe(w)
  r.push(data[0])
  r.push(data[1])
  r.push(data[2])
  r.push(null)
  w.on(
    'finish',
    common.mustCall(() => {
      assert.strictEqual(receivedData, data.join(''))
    })
  )
}
{
  let receivedData = ''
  const w = new Writable({
    write: (chunk, env, callback) => {
      receivedData += chunk
      callback()
    }
  })
  const data = ['foo', 'bar', 'baz']
  const r = new Readable({
    read: () => {}
  })
  r.pipe(w)
  r.push(data[0])
  r.push(data[1])
  r.push(data[2])
  r.push(null)
  r.once('readable', common.mustCall())
  w.on(
    'finish',
    common.mustCall(() => {
      assert.strictEqual(receivedData, data.join(''))
    })
  )
}

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