packages feed

bitcoin-hs-0.0.1: Bitcoin/Test/Script/RunTests.hs

-- | Running the script test
module Bitcoin.Test.Script.RunTests where

--------------------------------------------------------------------------------

import Test.Tasty
import Test.Tasty.HUnit

import Data.Word
import Data.Char ( isDigit )
import qualified Data.ByteString as B

import Bitcoin.Script.Base
import Bitcoin.Script.Run
import Bitcoin.Script.Serialize

import Bitcoin.Misc.HexString
import Bitcoin.Misc.OctetStream

import Bitcoin.Protocol.Hash
import Bitcoin.BlockChain.Base

import Bitcoin.Test.Script.Valid
import Bitcoin.Test.Script.Invalid
import Bitcoin.Test.Script.Parser

--------------------------------------------------------------------------------

testgroup_Script :: TestTree
testgroup_Script = testGroup "Script" 
  [ testgroup_Valid
  , testgroup_Invalid
  ]

testgroup_Valid :: TestTree
testgroup_Valid = testGroup "valid scripts" 
  [ testCase ("valid script #" ++ show i) (assertOK $ runTestCase scr) 
  | (i,scr) <- zip [1..] valid_testcases
  ]

testgroup_Invalid :: TestTree
testgroup_Invalid = testGroup "invalid scripts"
  [ testCase ("invalid script #" ++ show i) (assertNotOK $ runTestCase scr) 
  | (i,scr) <- zip [1..] invalid_testcases
  ]

assertOK :: (Bool,String) -> Assertion
assertOK (b,msg) = case b of
  False -> assertFailure msg
  True  -> return ()

assertNotOK :: (Bool,String) -> Assertion
assertNotOK (b,msg) = assertOK (not b, msg)

--------------------------------------------------------------------------------

-- | test cases which should pass
valid_testcases :: [TestCase]
valid_testcases   = map parseInner valid_json   

-- | test cases which should not pass
invalid_testcases :: [TestCase]
invalid_testcases = map parseInner invalid_json 

--------------------------------------------------------------------------------

-- | True if passed, False if failed, 
-- and possibly an explanation if failed (including the testcase comment if exists)
runTestCase :: TestCase -> (Bool, String)
runTestCase (TestCase eiSig eiPk mbcomment) = result where

  sig = eiToRawScript eiSig :: RawScript
  pk  = eiToRawScript eiPk  :: RawScript

  prevTx = Tx 0 [] [TxOutput 666 pk] LockImmed zeroHash256        :: Tx RawScript RawScript
  inExt  = TxInput zeroHash256 0 (prevTx,sig) 0                   :: TxInput (Tx RawScript RawScript, RawScript)
  fakeTx = Tx 0 [inExt] [TxOutput 666 sig] LockImmed zeroHash256  :: Tx (Tx RawScript RawScript, RawScript) RawScript

  result = case checkTransaction fakeTx of
    Left err -> (False , err ++ " | " ++ maybe "" id mbcomment)
    Right b  -> (b     ,        " | " ++ maybe "" id mbcomment) 

--------------------------------------------------------------------------------

{-
runValid   = mapM_ print $ map runTestCase valid_testcases
runInvalid = mapM_ print $ map runTestCase invalid_testcases

--------------------------------------------------------------------------------

-- | for testing the hacked-together parser for Gavin's custom test format...
-- and also manually checking the cases
runAndSaveTestCases = do
  writeFile "_valid.txt"       $ unlines $ map show valid_testcases
  writeFile "_invalid.txt"     $ unlines $ map show invalid_testcases
  writeFile "_valid_run.txt"   $ unlines $ map show $ map runTestCase valid_testcases
  writeFile "_invalid_run.txt" $ unlines $ map show $ map runTestCase invalid_testcases
-}

--------------------------------------------------------------------------------