{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} module Test.Cardano.Ledger.Shelley.Imp.LedgerSpec ( spec, ) where import Cardano.Ledger.BaseTypes (inject) import Cardano.Ledger.Coin (Coin (..)) import Cardano.Ledger.Shelley.Core import Cardano.Ledger.Shelley.UTxO (UTxO (..)) import qualified Data.Map.Strict as Map import qualified Data.Sequence.Strict as SSeq import qualified Data.Set as Set import Lens.Micro ((&), (.~), (^.)) import Test.Cardano.Ledger.Core.Utils (txInAt) import Test.Cardano.Ledger.Imp.Common import Test.Cardano.Ledger.Shelley.ImpTest spec :: forall era. ShelleyEraImp era => SpecWith (ImpInit (LedgerSpec era)) spec :: forall era. ShelleyEraImp era => SpecWith (ImpInit (LedgerSpec era)) spec = String -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a. HasCallStack => String -> SpecWith a -> SpecWith a describe String "LEDGER" (SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era))) -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a b. (a -> b) -> a -> b $ do String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "Transactions update UTxO" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do addr1 <- ImpM (LedgerSpec era) Addr forall s (m :: * -> *) g. (HasKeyPairs s, MonadState s m, HasStatefulGen g m, MonadGen m) => m Addr freshKeyAddr_ let coin1 = Integer -> Coin Coin Integer 2000000 tx1 <- submitTxAnn "First transaction" . mkBasicTx $ mkBasicTxBody & outputsTxBodyL @era .~ SSeq.singleton (mkBasicTxOut addr1 $ inject coin1) UTxO utxo1 <- getUTxO case Map.lookup (txInAt 0 tx1) utxo1 of Just TxOut era out1 -> TxOut era out1 TxOut era -> Getting Coin (TxOut era) Coin -> Coin forall s a. s -> Getting a s a -> a ^. Getting Coin (TxOut era) Coin forall era. (HasCallStack, EraTxOut era) => Lens' (TxOut era) Coin Lens' (TxOut era) Coin coinTxOutL Coin -> Coin -> ImpM (LedgerSpec era) () forall (m :: * -> *) a. (HasCallStack, MonadIO m, Show a, Eq a) => a -> a -> m () `shouldBe` Coin coin1 Maybe (TxOut era) Nothing -> String -> ImpM (LedgerSpec era) () forall (m :: * -> *). (HasCallStack, MonadIO m) => String -> m () expectationFailure String "Could not find the TxOut of the first transaction" addr2 <- freshKeyAddr_ let coin2 = Integer -> Coin Coin Integer 3000000 tx2 <- submitTxAnn "Second transaction" . mkBasicTx $ mkBasicTxBody & inputsTxBodyL .~ Set.singleton (txInAt 0 tx1) & outputsTxBodyL @era .~ SSeq.singleton (mkBasicTxOut addr2 $ inject coin2) UTxO utxo2 <- getUTxO case Map.lookup (txInAt 0 tx2) utxo2 of Just TxOut era out1 -> do TxOut era out1 TxOut era -> Getting Coin (TxOut era) Coin -> Coin forall s a. s -> Getting a s a -> a ^. Getting Coin (TxOut era) Coin forall era. (HasCallStack, EraTxOut era) => Lens' (TxOut era) Coin Lens' (TxOut era) Coin coinTxOutL Coin -> Coin -> ImpM (LedgerSpec era) () forall (m :: * -> *) a. (HasCallStack, MonadIO m, Show a, Eq a) => a -> a -> m () `shouldBe` Coin coin2 Maybe (TxOut era) Nothing -> String -> ImpM (LedgerSpec era) () forall (m :: * -> *). (HasCallStack, MonadIO m) => String -> m () expectationFailure String "Could not find the TxOut of the second transaction"