'use strict' ;
var chai = chai || require ( 'chai' ) ;
var bitcore = bitcore || require ( '../bitcore' ) ;
var coinUtil = bitcore . util ;
var should = chai . should ( ) ;
var buffertools = require ( 'buffertools' ) ;
describe ( 'util' , function ( ) {
describe ( 'sha512' , function ( ) {
it ( 'should calculate this particular hash correctly' , function ( ) {
var data = new Buffer ( 'test data' ) ;
var hash = coinUtil . sha512 ( data ) ;
hash . toString ( 'hex' ) . should . equal ( '0e1e21ecf105ec853d24d728867ad70613c21663a4693074b2a3619c1bd39d66b588c33723bb466c72424e80e3ca63c249078ab347bab9428500e7ee43059d0d' ) ;
} ) ;
} ) ;
describe ( 'sha512hmac' , function ( ) {
it ( 'should calculate the value of this sha512hmac correctly' , function ( ) {
var data = new Buffer ( 'data' ) ;
var key = new Buffer ( 'key' ) ;
var mac = coinUtil . sha512hmac ( data , key ) ;
mac . toString ( 'hex' ) . should . equal ( '3c5953a18f7303ec653ba170ae334fafa08e3846f2efe317b87efce82376253cb52a8c31ddcde5a3a2eee183c2b34cb91f85e64ddbc325f7692b199473579c58' ) ;
} ) ;
} ) ;
describe ( 'exist' , function ( ) {
it ( 'should initialze the util object' , function ( ) {
should . exist ( bitcore . util ) ;
} ) ;
} ) ;
describe ( '#parseValue' , function ( ) {
it ( 'should convert floating points to satoshis correctly' , function ( ) {
function test_value ( datum ) {
var decimal = datum [ 0 ] ;
var intStr = datum [ 1 ] ;
var bn = coinUtil . parseValue ( decimal ) ;
should . exist ( bn ) ;
bn . toString ( ) . should . equal ( intStr ) ;
}
var dataValues = [
[ '0' , '0' ] ,
[ '1.0' , '100000000' ] ,
[ '0.1' , '10000000' ] ,
[ '.1' , '10000000' ] ,
[ '0.0005' , '50000' ] ,
[ '.000000001' , '0' ] ,
[ '.000000009' , '0' ] ,
[ '.00000000000000001' , '0' ]
] ;
dataValues . forEach ( function ( datum ) {
test_value ( datum ) ;
} ) ;
} ) ;
} ) ;
describe ( '#ripe160' , function ( ) {
var pk = 'a5c756101065ac5b8f689139e6d856fa99e54b5000b6428b43729d334cc9277d' ;
it ( 'should work for ' + pk , function ( ) {
var pubKeyHash = coinUtil . ripe160 ( new Buffer ( pk , 'hex' ) ) ;
var pkh = buffertools . toHex ( pubKeyHash ) ;
pkh . should . equal ( 'd166a41f27fd4b158f70314e5eee8998bf3d97d5' ) ;
} ) ;
} ) ;
describe ( '#sha256' , function ( ) {
var pk = '03d95e184cce34c3cfa58e9a277a09a7c5ed1b2a8134ea1e52887bc66fa3f47071'
it ( 'should work for ' + pk , function ( ) {
var pubKeyHash = coinUtil . sha256 ( pk ) ;
var pkh = buffertools . toHex ( pubKeyHash ) ;
pkh . should . equal ( 'a5c756101065ac5b8f689139e6d856fa99e54b5000b6428b43729d334cc9277d' ) ;
} ) ;
} ) ;
describe ( '#twoSha256' , function ( ) {
var data = new Buffer ( '907c2bc503ade11cc3b04eb2918b6f547b0630ab569273824748c87ea14b0696526c66ba740200000000fd1f9bdd4ef073c7afc4ae00da8a66f429c917a0081ad1e1dabce28d373eab81d8628de80200000000ad042b5f25efb33beec9f3364e8a9139e8439d9d7e26529c3c30b6c3fd89f8684cfd68ea0200000000599ac2fe02a526ed040000000008535300516352515164370e010000000003006300ab2ec2291fe51c6f' , 'hex' ) ;
it ( 'should work for ' + data . toString ( 'hex' ) , function ( ) {
var twoSha256 = buffertools . toHex ( buffertools . reverse ( coinUtil . twoSha256 ( data ) ) ) ;
var expected = '31af167a6cf3f9d5f6875caa4d31704ceb0eba078d132b78dab52c3b8997317e' ;
twoSha256 . should . equal ( expected ) ;
} ) ;
} ) ;
describe ( '#sha256ripe160' , function ( ) {
var pk = '03d95e184cce34c3cfa58e9a277a09a7c5ed1b2a8134ea1e52887bc66fa3f47071'
it ( 'should work for ' + pk , function ( ) {
var pubKeyHash = coinUtil . sha256ripe160 ( pk ) ;
var pkh = buffertools . toHex ( pubKeyHash ) ;
pkh . should . equal ( 'd166a41f27fd4b158f70314e5eee8998bf3d97d5' ) ;
} ) ;
} ) ;
describe ( '#ripemd160' , function ( ) {
var ripemdData = [
[ 'somemessage123' , '12fd01a7ec6b9ba23b3a5c16fbfab3ac19624a88' ] ,
[ '' , '9c1185a5c5e9fc54612808977ee8f548b2258d31' ] ,
[ '0000' , 'ab20e58c9eeb4776e719deff3158e26ca9edb636' ]
] ;
ripemdData . forEach ( function ( datum ) {
it ( 'should work for ' + datum [ 0 ] , function ( ) {
var r = coinUtil . ripe160 ( new bitcore . Buffer ( datum [ 0 ] ) ) ;
buffertools . toHex ( r ) . should . equal ( datum [ 1 ] ) ;
} ) ;
it ( 'should work for Buffer ' + datum [ 0 ] , function ( ) {
var r = coinUtil . ripe160 ( new Buffer ( datum [ 0 ] ) ) ;
buffertools . toHex ( r ) . should . equal ( datum [ 1 ] ) ;
} ) ;
} ) ;
} ) ;
describe ( '#intToBuffer2C' , function ( ) {
var data = [
[ 0 , '' ] ,
[ - 0 , '' ] ,
[ 1 , '01' ] ,
[ - 1 , 'ff' ] ,
[ 18 , '12' ] ,
[ - 18 , 'ee' ] ,
[ 127 , '7f' ] ,
[ 128 , '8000' ] ,
[ 129 , '8100' ] ,
[ 4096 , '0010' ] ,
[ - 4096 , '00f0' ] ,
[ 32767 , 'ff7f' ] ,
[ 878082192 , '90785634' ] ,
[ 0x01234567890 , '9078563412' ] ,
[ 4294967295 , 'ffffffff00' ] ,
[ 4294967296 , '0000000001' ] ,
[ 4294967297 , '0100000001' ] ,
[ 2147483647 , 'ffffff7f' ] ,
[ - 2147483647 , '01000080' ] ,
] ;
data . forEach ( function ( datum ) {
var integer = datum [ 0 ] ;
var result = datum [ 1 ] ;
it ( 'should work for ' + integer , function ( ) {
var buf = coinUtil . intToBuffer2C ( integer ) ;
var hex = buffertools . toHex ( buf ) ;
hex . should . equal ( result ) ;
} ) ;
} ) ;
} ) ;
describe ( '#varIntBuf' , function ( ) {
var data = [
[ 0 , '00' ] ,
[ 1 , '01' ] ,
[ 253 , 'fdfd00' ] ,
[ 254 , 'fdfe00' ] ,
[ 255 , 'fdff00' ] ,
[ 0x100 , 'fd0001' ] ,
[ 0x1000 , 'fd0010' ] ,
[ 0x1001 , 'fd0110' ] ,
[ 0x10000 , 'fe00000100' ] ,
[ 0x12345 , 'fe45230100' ] ,
[ 0x12345678 , 'fe78563412' ] ,
[ 0x123456789a , 'ff9a78563412000000' ] ,
[ 0x123456789abcde , 'ffdebc9a7856341200' ] ,
] ;
data . forEach ( function ( datum ) {
var integer = datum [ 0 ] ;
var result = datum [ 1 ] ;
it ( 'should work for ' + integer , function ( ) {
buffertools . toHex ( coinUtil . varIntBuf ( integer ) ) . should . equal ( result ) ;
} ) ;
} ) ;
} ) ;
describe ( '#getVarIntSize' , function ( ) {
var data = [
[ 0 , 1 ] ,
[ 1 , 1 ] ,
[ 252 , 1 ] ,
[ 253 , 3 ] ,
[ 254 , 3 ] ,
[ 0x100 , 3 ] ,
[ 0x1000 , 3 ] ,
[ 0x1001 , 3 ] ,
[ 0x10000 , 5 ] ,
[ 0x10001 , 5 ] ,
[ 0xffffffff , 5 ] ,
[ 0x100000000 , 9 ] ,
[ 0x100000001 , 9 ] ,
] ;
data . forEach ( function ( datum ) {
var integer = datum [ 0 ] ;
var result = datum [ 1 ] ;
it ( 'should work for ' + integer , function ( ) {
coinUtil . getVarIntSize ( integer ) . should . equal ( result ) ;
} ) ;
} ) ;
} ) ;
describe ( '#intToBufferSM' , function ( ) {
var data = [
[ 0 , '' ] ,
[ 1 , '01' ] ,
[ - 1 , '81' ] ,
[ 2 , '02' ] ,
[ - 2 , '82' ] ,
[ - 32768 , '008080' ] ,
] ;
data . forEach ( function ( datum ) {
var i = datum [ 0 ] ;
var hex = datum [ 1 ] ;
it ( 'should work for ' + i , function ( ) {
var result = coinUtil . intToBufferSM ( i ) ;
buffertools . toHex ( result ) . should . equal ( hex ) ;
} ) ;
} ) ;
} ) ;
describe ( '#calcDifficulty' , function ( ) {
var bitsgenesis = 486604799 ;
it ( 'should work for the bits from the genesis block; ' + bitsgenesis , function ( ) {
var difficulty = coinUtil . calcDifficulty ( bitsgenesis ) ;
difficulty . should . equal ( 1 ) ;
} ) ;
var randomotherbits = 419476394 ;
it ( 'should work for the bits in a randomly chosen block, eg [00000000000000001fef2bbc6da9b65e16f9187b7d88f15a308490bf2c9b8e1d] ' + randomotherbits , function ( ) {
var difficulty = coinUtil . calcDifficulty ( randomotherbits ) ;
difficulty . should . equal ( 6119726089 ) ;
} ) ;
} ) ;
} ) ;