var B = require('../').Buffer
var test = require('tape')

test('buffer.toJSON', function (t) {
  var data = [1, 2, 3, 4]
  t.deepEqual(
    new B(data).toJSON(),
    { type: 'Buffer', data: [ 1, 2, 3, 4 ] }
  )
  t.end()
})

test('buffer.copy', function (t) {
  // copied from nodejs.org example
  var buf1 = new B(26)
  var buf2 = new B(26)

  for (var i = 0; i < 26; i++) {
    buf1[i] = i + 97 // 97 is ASCII a
    buf2[i] = 33 // ASCII !
  }

  buf1.copy(buf2, 8, 16, 20)

  t.equal(
    buf2.toString('ascii', 0, 25),
    '!!!!!!!!qrst!!!!!!!!!!!!!'
  )
  t.end()
})

test('test offset returns are correct', function (t) {
  var b = new B(16)
  t.equal(4, b.writeUInt32LE(0, 0))
  t.equal(6, b.writeUInt16LE(0, 4))
  t.equal(7, b.writeUInt8(0, 6))
  t.equal(8, b.writeInt8(0, 7))
  t.equal(16, b.writeDoubleLE(0, 8))
  t.end()
})

test('concat() a varying number of buffers', function (t) {
  var zero = []
  var one = [ new B('asdf') ]
  var long = []
  for (var i = 0; i < 10; i++) {
    long.push(new B('asdf'))
  }

  var flatZero = B.concat(zero)
  var flatOne = B.concat(one)
  var flatLong = B.concat(long)
  var flatLongLen = B.concat(long, 40)

  t.equal(flatZero.length, 0)
  t.equal(flatOne.toString(), 'asdf')
  t.deepEqual(flatOne, one[0])
  t.equal(flatLong.toString(), (new Array(10 + 1).join('asdf')))
  t.equal(flatLongLen.toString(), (new Array(10 + 1).join('asdf')))
  t.end()
})

test('concat() works on Uint8Array instances', function (t) {
  var result = B.concat([new Uint8Array([1, 2]), new Uint8Array([3, 4])])
  var expected = Buffer.from([1, 2, 3, 4])
  t.deepEqual(result, expected)
  t.end()
})

test('fill', function (t) {
  var b = new B(10)
  b.fill(2)
  t.equal(b.toString('hex'), '02020202020202020202')
  t.end()
})

test('fill (string)', function (t) {
  var b = new B(10)
  b.fill('abc')
  t.equal(b.toString(), 'abcabcabca')
  b.fill('է')
  t.equal(b.toString(), 'էէէէէ')
  t.end()
})

test('copy() empty buffer with sourceEnd=0', function (t) {
  var source = new B([42])
  var destination = new B([43])
  source.copy(destination, 0, 0, 0)
  t.equal(destination.readUInt8(0), 43)
  t.end()
})

test('copy() after slice()', function (t) {
  var source = new B(200)
  var dest = new B(200)
  var expected = new B(200)
  for (var i = 0; i < 200; i++) {
    source[i] = i
    dest[i] = 0
  }

  source.slice(2).copy(dest)
  source.copy(expected, 0, 2)
  t.deepEqual(dest, expected)
  t.end()
})

test('copy() ascending', function (t) {
  var b = new B('abcdefghij')
  b.copy(b, 0, 3, 10)
  t.equal(b.toString(), 'defghijhij')
  t.end()
})

test('copy() descending', function (t) {
  var b = new B('abcdefghij')
  b.copy(b, 3, 0, 7)
  t.equal(b.toString(), 'abcabcdefg')
  t.end()
})

test('buffer.slice sets indexes', function (t) {
  t.equal((new B('hallo')).slice(0, 5).toString(), 'hallo')
  t.end()
})

test('buffer.slice out of range', function (t) {
  t.plan(2)
  t.equal((new B('hallo')).slice(0, 10).toString(), 'hallo')
  t.equal((new B('hallo')).slice(10, 2).toString(), '')
  t.end()
})
