From 3f53b528a86c15de7ef0c5add0818bc535d1a207 Mon Sep 17 00:00:00 2001
From: Daniel Cousens <github@dcousens.com>
Date: Wed, 28 Jan 2015 17:31:06 +1100
Subject: [PATCH] tests: reduce setup-code duplication

---
 test/fixtures/transaction_builder.json |   1 +
 test/transaction_builder.js            | 129 +++++++++++--------------
 2 files changed, 55 insertions(+), 75 deletions(-)

diff --git a/test/fixtures/transaction_builder.json b/test/fixtures/transaction_builder.json
index 9a356ce..8122304 100644
--- a/test/fixtures/transaction_builder.json
+++ b/test/fixtures/transaction_builder.json
@@ -168,6 +168,7 @@
       {
         "description": "Incomplete transaction w/ prevTxScript defined",
         "exception": "Transaction is not complete",
+        "alwaysThrows": true,
         "inputs": [
           {
             "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
diff --git a/test/transaction_builder.js b/test/transaction_builder.js
index 9356e3d..6c5ba21 100644
--- a/test/transaction_builder.js
+++ b/test/transaction_builder.js
@@ -9,6 +9,44 @@ var TransactionBuilder = require('../src/transaction_builder')
 
 var fixtures = require('./fixtures/transaction_builder')
 
+function construct(txb, f, sign) {
+  f.inputs.forEach(function(input) {
+    var prevTxScript
+
+    if (input.prevTxScript) {
+      prevTxScript = Script.fromASM(input.prevTxScript)
+    }
+
+    txb.addInput(input.txId, input.vout, input.sequence, prevTxScript)
+  })
+
+  f.outputs.forEach(function(output) {
+    var script = Script.fromASM(output.script)
+
+    txb.addOutput(script, output.value)
+  })
+
+  if (sign === undefined || sign) {
+    f.inputs.forEach(function(input, index) {
+      var redeemScript
+
+      if (input.redeemScript) {
+        redeemScript = Script.fromASM(input.redeemScript)
+      }
+
+      input.privKeys.forEach(function(wif) {
+        var privKey = ECKey.fromWIF(wif)
+
+        txb.sign(index, privKey, redeemScript)
+      })
+    })
+  }
+
+  // FIXME: add support for locktime/version in TransactionBuilder API
+  if (f.version !== undefined) txb.tx.version = f.version
+  if (f.locktime !== undefined) txb.tx.locktime = f.locktime
+}
+
 describe('TransactionBuilder', function() {
   var privAddress, privScript
   var prevTx, prevTxHash
@@ -135,21 +173,7 @@ describe('TransactionBuilder', function() {
 
     fixtures.invalid.sign.forEach(function(f) {
       it('throws on ' + f.exception + ' (' + f.description + ')', function() {
-        f.inputs.forEach(function(input) {
-          var prevTxScript
-
-          if (input.prevTxScript) {
-            prevTxScript = Script.fromASM(input.prevTxScript)
-          }
-
-          txb.addInput(input.txId, input.vout, input.sequence, prevTxScript)
-        })
-
-        f.outputs.forEach(function(output) {
-          var script = Script.fromASM(output.script)
-
-          txb.addOutput(script, output.value)
-        })
+        construct(txb, f, false)
 
         f.inputs.forEach(function(input, index) {
           var redeemScript
@@ -178,39 +202,7 @@ describe('TransactionBuilder', function() {
   describe('build', function() {
     fixtures.valid.build.forEach(function(f) {
       it('builds \"' + f.description + '\"', function() {
-        f.inputs.forEach(function(input) {
-          var prevTxScript
-
-          if (input.prevTxScript) {
-            prevTxScript = Script.fromASM(input.prevTxScript)
-          }
-
-          txb.addInput(input.txId, input.vout, input.sequence, prevTxScript)
-        })
-
-        f.outputs.forEach(function(output) {
-          var script = Script.fromASM(output.script)
-
-          txb.addOutput(script, output.value)
-        })
-
-        f.inputs.forEach(function(input, index) {
-          var redeemScript
-
-          if (input.redeemScript) {
-            redeemScript = Script.fromASM(input.redeemScript)
-          }
-
-          input.privKeys.forEach(function(wif) {
-            var privKey = ECKey.fromWIF(wif)
-
-            txb.sign(index, privKey, redeemScript)
-          })
-        })
-
-        // FIXME: add support for locktime/version in TransactionBuilder API
-        if (f.version !== undefined) txb.tx.version = f.version
-        if (f.locktime !== undefined) txb.tx.locktime = f.locktime
+        construct(txb, f)
 
         var tx = txb.build()
         assert.equal(tx.toHex(), f.txHex)
@@ -218,40 +210,27 @@ describe('TransactionBuilder', function() {
     })
 
     fixtures.invalid.build.forEach(function(f) {
-      it('throws on ' + f.exception + ' (' + f.description + ')', function() {
-        f.inputs.forEach(function(input) {
-          var prevTxScript
+      describe('for ' + f.description, function() {
+        beforeEach(function() {
+          if (f.txHex) {
+            var tx = Transaction.fromHex(f.txHex)
+            txb = TransactionBuilder.fromTransaction(tx)
 
-          if (input.prevTxScript) {
-            prevTxScript = Script.fromASM(input.prevTxScript)
+          } else {
+            construct(txb, f)
           }
-
-          txb.addInput(input.txId, input.vout, input.sequence, prevTxScript)
         })
 
-        f.outputs.forEach(function(output) {
-          var script = Script.fromASM(output.script)
-
-          txb.addOutput(script, output.value)
+        it('throws on ' + f.exception, function() {
+          assert.throws(function() {
+            txb.build()
+          }, new RegExp(f.exception))
         })
 
-        f.inputs.forEach(function(input, index) {
-          var redeemScript
-
-          if (input.redeemScript) {
-            redeemScript = Script.fromASM(input.redeemScript)
-          }
-
-          input.privKeys.forEach(function(wif) {
-            var privKey = ECKey.fromWIF(wif)
-
-            txb.sign(index, privKey, redeemScript)
-          })
+        if (f.alwaysThrows) return
+        it('doesn\'t throw if building incomplete', function() {
+          txb.buildIncomplete()
         })
-
-        assert.throws(function() {
-          txb.build()
-        }, new RegExp(f.exception))
       })
     })
   })