'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')
const ABC = new Uint8Array([0x41, 0x42, 0x43])
const DEF = new Uint8Array([0x44, 0x45, 0x46])
const GHI = new Uint8Array([0x47, 0x48, 0x49])
{
  // Simple Writable test.

  let n = 0
  const writable = new Writable({
    write: common.mustCall((chunk, encoding, cb) => {
      assert(chunk instanceof Buffer)
      if (n++ === 0) {
        assert.strictEqual(String(chunk), 'ABC')
      } else {
        assert.strictEqual(String(chunk), 'DEF')
      }
      cb()
    }, 2)
  })
  writable.write(ABC)
  writable.end(DEF)
}
{
  // Writable test, pass in Uint8Array in object mode.

  const writable = new Writable({
    objectMode: true,
    write: common.mustCall((chunk, encoding, cb) => {
      assert(!(chunk instanceof Buffer))
      assert(chunk instanceof Uint8Array)
      assert.strictEqual(chunk, ABC)
      assert.strictEqual(encoding, 'utf8')
      cb()
    })
  })
  writable.end(ABC)
}
{
  // Writable test, multiple writes carried out via writev.
  let callback
  const writable = new Writable({
    write: common.mustCall((chunk, encoding, cb) => {
      assert(chunk instanceof Buffer)
      assert.strictEqual(encoding, 'buffer')
      assert.strictEqual(String(chunk), 'ABC')
      callback = cb
    }),
    writev: common.mustCall((chunks, cb) => {
      assert.strictEqual(chunks.length, 2)
      assert.strictEqual(chunks[0].encoding, 'buffer')
      assert.strictEqual(chunks[1].encoding, 'buffer')
      assert.strictEqual(chunks[0].chunk + chunks[1].chunk, 'DEFGHI')
    })
  })
  writable.write(ABC)
  writable.write(DEF)
  writable.end(GHI)
  callback()
}
{
  // Simple Readable test.
  const readable = new Readable({
    read() {}
  })
  readable.push(DEF)
  readable.unshift(ABC)
  const buf = readable.read()
  assert(buf instanceof Buffer)
  assert.deepStrictEqual([...buf], [...ABC, ...DEF])
}
{
  // Readable test, setEncoding.
  const readable = new Readable({
    read() {}
  })
  readable.setEncoding('utf8')
  readable.push(DEF)
  readable.unshift(ABC)
  const out = readable.read()
  assert.strictEqual(out, 'ABCDEF')
}

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