{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}

module Test.Cardano.Ledger.ToolsSpec (spec) where

import Cardano.Ledger.Tools
import qualified Data.ByteString as BS
import Test.Cardano.Ledger.Common
import Test.QuickCheck.Instances.ByteString ()

spec :: Spec
spec :: Spec
spec = forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Tools" forall a b. (a -> b) -> a -> b
$ do
  forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"`integralToByteStringN . byteStringToNum` roundtrips" forall a b. (a -> b) -> a -> b
$ do
    ByteString
bs <- forall a. Arbitrary a => Gen a
arbitrary
    forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall i. (Integral i, Bits i) => Int -> i -> ByteString
integralToByteStringN (ByteString -> Int
BS.length ByteString
bs) (forall i. (Bits i, Num i) => ByteString -> i
byteStringToNum @Integer ByteString
bs) forall a. (Eq a, Show a) => a -> a -> Property
=== ByteString
bs
  forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"`byteStringToNum . integralToByteStringN` roundtrips" forall a b. (a -> b) -> a -> b
$ do
    Positive (Integer
n :: Integer) <- forall a. Arbitrary a => Gen a
arbitrary
    forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall i. (Bits i, Num i) => ByteString -> i
byteStringToNum (forall i. (Integral i, Bits i) => Int -> i -> ByteString
integralToByteStringN Int
64 Integer
n) forall a. (Eq a, Show a) => a -> a -> Property
=== Integer
n