text: // Copyright (c) 2015 The Bitcoin Core developers
  // Distributed under the MIT software license, see the accompanying
  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
  
  #ifndef BITCOIN_TEST_TEST_BITCOIN_H
  #define BITCOIN_TEST_TEST_BITCOIN_H
  
  #include "chainparamsbase.h"
  #include "key.h"
  #include "pubkey.h"
  #include "txdb.h"
  #include "txmempool.h"
  
  #include <boost/filesystem.hpp>
  #include <boost/thread.hpp>
  
  /** Basic testing setup.
   * This just configures logging and chain parameters.
   */
  struct BasicTestingSetup {
      ECCVerifyHandle globalVerifyHandle;
  
      BasicTestingSetup(const std::string& chainName = CBaseChainParams::MAIN);
      ~BasicTestingSetup();
  };
  
  /** Testing setup that configures a complete environment.
   * Included are data directory, coins database, script check threads setup.
   */
  struct TestingSetup : public BasicTestingSetup {
      CCoinsViewDB* pcoinsdbview;
      boost::filesystem::path pathTemp;
      boost::thread_group threadGroup;
  
      TestingSetup(const std::string& chainName = CBaseChainParams::MAIN);
      ~TestingSetup();
  };
  
  class CBlock;
  struct CMutableTransaction;
  class CScript;
  
  struct TestChain100Setup : public TestingSetup {
      TestChain100Setup();
  
      CBlock CreateAndProcessBlock(const std::vector<CMutableTransaction>& txns,
                                   const CScript& scriptPubKey);
  
      ~TestChain100Setup();
  
      std::vector<CTransaction> coinbaseTxns; // For convenience, coinbase transactions
      CKey coinbaseKey; // private/public key needed to spend coinbase transactions
  };
  
  class CTxMemPoolEntry;
  class CTxMemPool;
  
  struct TestMemPoolEntryHelper {
  
      CAmount nFee;
      int64_t nTime;
      double dPriority;
      unsigned int nHeight;
      bool hadNoDependencies;
      bool spendsCoinbase;
      unsigned int sigOpCost;
      LockPoints lp;
  
      TestMemPoolEntryHelper()
          : nFee(0)
          , nTime(0)
          , dPriority(0.0)
          , nHeight(1)
          , hadNoDependencies(false)
          , spendsCoinbase(false)
          , sigOpCost(4)
      {
      }
  
      CTxMemPoolEntry FromTx(CMutableTransaction& tx, CTxMemPool* pool = NULL);
      CTxMemPoolEntry FromTx(CTransaction& tx, CTxMemPool* pool = NULL);
  
      TestMemPoolEntryHelper& Fee(CAmount _fee)
      {
          nFee = _fee;
          return *this;
      }
      TestMemPoolEntryHelper& Time(int64_t _time)
      {
          nTime = _time;
          return *this;
      }
      TestMemPoolEntryHelper& Priority(double _priority)
      {
          dPriority = _priority;
          return *this;
      }
      TestMemPoolEntryHelper& Height(unsigned int _height)
      {
          nHeight = _height;
          return *this;
      }
      TestMemPoolEntryHelper& HadNoDependencies(bool _hnd)
      {
          hadNoDependencies = _hnd;
          return *this;
      }
      TestMemPoolEntryHelper& SpendsCoinbase(bool _flag)
      {
          spendsCoinbase = _flag;
          return *this;
      }
      TestMemPoolEntryHelper& SigOpsCost(unsigned int _sigopsCost)
      {
          sigOpCost = _sigopsCost;
          return *this;
      }
  };
  #endif
  