'use strict'

const tap = require('tap')
const silentConsole = {
  log() {},
  error() {}
}
const common = require('../common')

// Regression test for https://github.com/nodejs/node/issues/12718.
// Tests that piping a source stream twice to the same destination stream
// works, and that a subsequent unpipe() call only removes the pipe *once*.
const assert = require('assert')
const { PassThrough, Writable } = require('../../lib/ours/index')
{
  const passThrough = new PassThrough()
  const dest = new Writable({
    write: common.mustCall((chunk, encoding, cb) => {
      assert.strictEqual(`${chunk}`, 'foobar')
      cb()
    })
  })
  passThrough.pipe(dest)
  passThrough.pipe(dest)
  assert.strictEqual(passThrough._events.data.length, 2)
  assert.strictEqual(passThrough._readableState.pipes.length, 2)
  assert.strictEqual(passThrough._readableState.pipes[0], dest)
  assert.strictEqual(passThrough._readableState.pipes[1], dest)
  passThrough.unpipe(dest)
  assert.strictEqual(passThrough._events.data.length, 1)
  assert.strictEqual(passThrough._readableState.pipes.length, 1)
  assert.deepStrictEqual(passThrough._readableState.pipes, [dest])
  passThrough.write('foobar')
  passThrough.pipe(dest)
}
{
  const passThrough = new PassThrough()
  const dest = new Writable({
    write: common.mustCall((chunk, encoding, cb) => {
      assert.strictEqual(`${chunk}`, 'foobar')
      cb()
    }, 2)
  })
  passThrough.pipe(dest)
  passThrough.pipe(dest)
  assert.strictEqual(passThrough._events.data.length, 2)
  assert.strictEqual(passThrough._readableState.pipes.length, 2)
  assert.strictEqual(passThrough._readableState.pipes[0], dest)
  assert.strictEqual(passThrough._readableState.pipes[1], dest)
  passThrough.write('foobar')
}
{
  const passThrough = new PassThrough()
  const dest = new Writable({
    write: common.mustNotCall()
  })
  passThrough.pipe(dest)
  passThrough.pipe(dest)
  assert.strictEqual(passThrough._events.data.length, 2)
  assert.strictEqual(passThrough._readableState.pipes.length, 2)
  assert.strictEqual(passThrough._readableState.pipes[0], dest)
  assert.strictEqual(passThrough._readableState.pipes[1], dest)
  passThrough.unpipe(dest)
  passThrough.unpipe(dest)
  assert.strictEqual(passThrough._events.data, undefined)
  assert.strictEqual(passThrough._readableState.pipes.length, 0)
  passThrough.write('foobar')
}

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