/* global describe, it */

var assert = require('assert')
var message = require('../src/message')
var networks = require('../src/networks')

var BigInteger = require('bigi')
var ECPair = require('../src/ecpair')

var fixtures = require('./fixtures/message.json')

describe('message', function () {
  describe('magicHash', function () {
    fixtures.valid.magicHash.forEach(function (f) {
      it('produces the correct magicHash for "' + f.message + '" (' + f.network + ')', function () {
        var network = networks[f.network]
        var actual = message.magicHash(f.message, network)

        assert.strictEqual(actual.toString('hex'), f.magicHash)
      })
    })
  })

  describe('verify', function () {
    fixtures.valid.verify.forEach(function (f) {
      it('verifies a valid signature for "' + f.message + '" (' + f.network + ')', function () {
        var network = networks[f.network]

        assert(message.verify(f.address, f.signature, f.message, network))

        if (f.compressed) {
          assert(message.verify(f.compressed.address, f.compressed.signature, f.message, network))
        }
      })
    })

    fixtures.invalid.verify.forEach(function (f) {
      it(f.description, function () {
        assert(!message.verify(f.address, f.signature, f.message))
      })
    })
  })

  describe('signing', function () {
    fixtures.valid.signing.forEach(function (f) {
      it(f.description, function () {
        var network = networks[f.network]

        var keyPair = new ECPair(new BigInteger(f.d), null, {
          compressed: false
        })
        var signature = message.sign(keyPair, f.message, network)
        assert.strictEqual(signature.toString('base64'), f.signature)

        if (f.compressed) {
          var compressedPrivKey = new ECPair(new BigInteger(f.d))
          var compressedSignature = message.sign(compressedPrivKey, f.message)

          assert.strictEqual(compressedSignature.toString('base64'), f.compressed.signature)
        }
      })
    })
  })
})