From bdeac4e67d33cee3ad4b0ee109e5dda665b79408 Mon Sep 17 00:00:00 2001 From: Esteban Ordano Date: Fri, 9 Jan 2015 16:53:50 -0300 Subject: [PATCH] Add inspect method to output --- .jshintrc | 2 +- lib/transaction/output.js | 19 ++++++++---- lib/transaction/transaction.js | 2 +- test/transaction/output.js | 54 ++++++++++++++++++++++++++++++++++ 4 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 test/transaction/output.js diff --git a/.jshintrc b/.jshintrc index 1d70b696f..40fd8c6f6 100644 --- a/.jshintrc +++ b/.jshintrc @@ -28,7 +28,7 @@ "maxcomplexity": 6, // Cyclomatic complexity (http://en.wikipedia.org/wiki/Cyclomatic_complexity) "maxdepth": 4, // Maximum depth of nested control structures "maxlen": 120, // Maximum number of cols in a line - "multistr": true // Allow use of multiline EOL escaping + "multistr": true, // Allow use of multiline EOL escaping "predef": [ // Extra globals. "after", diff --git a/lib/transaction/output.js b/lib/transaction/output.js index 0d48c442a..fcbab1d3e 100644 --- a/lib/transaction/output.js +++ b/lib/transaction/output.js @@ -13,6 +13,9 @@ function Output(params) { return new Output(params); } if (params) { + if (JSUtil.isValidJSON(params)) { + return Output.fromJSON(params); + } return this._fromObject(params); } } @@ -34,13 +37,15 @@ Object.defineProperty(Output.prototype, 'satoshis', { writeable: true, enumerable: true, get: function() { - return this._satoshis.toNumber(); + return this._satoshis; }, set: function(num) { if (num instanceof BN) { - this._satoshis = num; + this._satoshisBN = num; + this._satoshis = num.toNumber(); } else { - this._satoshis = BN.fromNumber(num); + this._satoshisBN = BN.fromNumber(num); + this._satoshis = num; } } }); @@ -90,9 +95,13 @@ Output.prototype.setScript = function(script) { return this; }; +Output.prototype.inspect = function() { + return ''; +}; + Output.fromBufferReader = function(br) { var output = new Output(); - output._satoshis = br.readUInt64LEBN(); + output.satoshis = br.readUInt64LEBN(); var size = br.readVarintNum(); if (size !== 0) { output._scriptBuffer = br.read(size); @@ -106,7 +115,7 @@ Output.prototype.toBufferWriter = function(writer) { if (!writer) { writer = new BufferWriter(); } - writer.writeUInt64LEBN(this._satoshis); + writer.writeUInt64LEBN(this._satoshisBN); var script = this._scriptBuffer; writer.writeVarintNum(script.length); writer.write(script); diff --git a/lib/transaction/transaction.js b/lib/transaction/transaction.js index 38568fe01..c219a7c5e 100644 --- a/lib/transaction/transaction.js +++ b/lib/transaction/transaction.js @@ -666,7 +666,7 @@ Transaction.prototype.verify = function() { var valueoutbn = BN(0); for (var i = 0; i < this.outputs.length; i++) { var txout = this.outputs[i]; - var valuebn = txout._satoshis; + var valuebn = txout._satoshisBN; if (valuebn.lt(0)) { return 'transaction txout ' + i + ' negative'; } diff --git a/test/transaction/output.js b/test/transaction/output.js new file mode 100644 index 000000000..529233c06 --- /dev/null +++ b/test/transaction/output.js @@ -0,0 +1,54 @@ +'use strict'; + +/* jshint unused: false */ +/* jshint latedef: false */ +var should = require('chai').should(); +var expect = require('chai').expect; +var _ = require('lodash'); + +var bitcore = require('../..'); +var BN = bitcore.crypto.BN; +var BufferWriter = bitcore.encoding.BufferWriter; +var BufferReader = bitcore.encoding.BufferReader; +var Output = bitcore.Transaction.Output; +var Script = bitcore.Script; + +var errors = bitcore.errors; + +describe('Output', function() { + + var output = new Output({satoshis: 0, script: Script.empty()}); + + it('can be assigned a satoshi amount in big number', function() { + var newOutput = new Output({satoshis: new BN(100), script: Script.empty()}); + newOutput.satoshis.should.equal(100); + }); + + var expectEqualOutputs = function(a, b) { + a.satoshis.should.equal(b.satoshis); + a.script.toString().should.equal(b.script.toString()); + }; + + it('deserializes correctly a simple output', function() { + var writer = new BufferWriter(); + output.toBufferWriter(writer); + var deserialized = Output.fromBufferReader(new BufferReader(writer.toBuffer())); + expectEqualOutputs(output, deserialized); + }); + + it('roundtrips to/from object', function() { + var newOutput = new Output({satoshis: 50, script: new Script().add(0)}); + var otherOutput = new Output(newOutput.toObject()); + expectEqualOutputs(newOutput, otherOutput); + }); + + it('can set a script from a buffer', function() { + var newOutput = Output(output); + newOutput.setScript(Script().add(0).toBuffer()); + newOutput.inspect().should.equal('>'); + }); + + it('has a inspect property', function() { + output.inspect().should.equal('>'); + }); +});