{-# LANGUAGE OverloadedStrings #-}
module TestVectors
( vectorSuite
) where
import Test.Tasty
import Test.Tasty.HUnit
import Data.ASN1.Encoding
import Data.ASN1.BinaryEncoding
import Data.Aeson
import Data.Aeson.Types
import Data.Aeson.Quick
import Data.Maybe
import Data.Monoid
import qualified Data.ByteString as BS
import qualified Data.ByteString.Base16 as B16
import qualified Data.Text as T
import Data.Text.Encoding (encodeUtf8)
import System.IO.Unsafe
import Network.CryptoConditions
import Network.CryptoConditions.Encoding
import TestSupport
vectorSuite :: TestTree
vectorSuite = testGroup "fiveBells"
[ testVectors "0000_test-minimal-preimage.json"
, testVectors "0001_test-minimal-prefix.json"
, testVectors "0002_test-minimal-threshold.json"
, testVectors "0004_test-minimal-ed25519.json"
, testVectors "0006_test-basic-prefix.json"
, testVectors "0012_test-basic-threshold-schroedinger.json"
, testVectors "0017_test-advanced-notarized-receipt-multiple-notaries.json"
]
testVectors :: String -> TestTree
testVectors file = testGroup file
[ testCase "encodeCondition" $ encodeCondition cond @?= condBin
, testCase "getFulfillment" $ getFulfillment cond @?= Just ffillBin
, testCase "getConditionURI" $ getConditionURI cond @?= condUri
, testCase "validate" $ validate condUri cond msg @?= True
, testCase "readCondition" $
let econd = readCondition condBin :: Either String Condition
in (getConditionURI <$> econd) @?= Right condUri
]
where
val = unsafePerformIO $ do
let path = "ext/crypto-conditions/test-vectors/valid/" <> file
fromJust . decodeStrict <$> BS.readFile path
cond = val .! "{json}" :: Condition
condBin = fromB16 $ val .! "{conditionBinary}"
ffillBin = fromB16 $ val .! "{fulfillment}"
condUri = val .! "{conditionUri}"
msg = encodeUtf8 $ val .! "{message}"
fromB16 :: T.Text -> BS.ByteString
fromB16 t = let (r,"") = B16.decode $ encodeUtf8 t
in r