packages feed

solana-haskell-sdk-1.2.0.0: test/Test/NativePrograms/ComputeBudget.hs

{-# LANGUAGE OverloadedStrings #-}

module Test.NativePrograms.ComputeBudget (tests) where

import Data.Binary (decode, decodeOrFail, encode)
import Data.Binary.Get (ByteOffset)
import Data.ByteString qualified as BS
import Data.ByteString.Lazy qualified as BL
import Network.Solana.Core.Instruction
import Network.Solana.NativePrograms.ComputeBudget qualified as CB
import Test.Fixtures
import Test.Tasty
import Test.Tasty.HUnit
import Test.Tasty.QuickCheck

dataOf :: Instruction -> BS.ByteString
dataOf = instrData . iData

genComputeBudgetInstruction :: Gen CB.ComputeBudgetInstruction
genComputeBudgetInstruction =
  oneof
    [ CB.RequestHeapFrame <$> arbitrary,
      CB.SetComputeUnitLimit <$> arbitrary,
      CB.SetComputeUnitPrice <$> arbitrary,
      CB.SetLoadedAccountsDataSizeLimit <$> arbitrary
    ]

tests :: TestTree
tests =
  withResource
    (loadFixtures "test/fixtures/compute_budget_instruction_data.json")
    (const (pure ()))
    $ \getFixtures ->
      testGroup
        "ComputeBudget (golden + properties)"
        [ testCase "RequestHeapFrame" $ do
            fs <- getFixtures
            dataOf (CB.requestHeapFrame 32768) @?= requireFixture "RequestHeapFrame" fs,
          testCase "SetComputeUnitLimit" $ do
            fs <- getFixtures
            dataOf (CB.setComputeUnitLimit 200000) @?= requireFixture "SetComputeUnitLimit" fs,
          testCase "SetComputeUnitPrice" $ do
            fs <- getFixtures
            dataOf (CB.setComputeUnitPrice 1000) @?= requireFixture "SetComputeUnitPrice" fs,
          testCase "SetLoadedAccountsDataSizeLimit" $ do
            fs <- getFixtures
            dataOf (CB.setLoadedAccountsDataSizeLimit 65536)
              @?= requireFixture "SetLoadedAccountsDataSizeLimit" fs,
          testCase "builders take no accounts" $ do
            iAccounts (CB.requestHeapFrame 1024) @?= []
            iAccounts (CB.setComputeUnitLimit 1) @?= []
            iAccounts (CB.setComputeUnitPrice 1) @?= []
            iAccounts (CB.setLoadedAccountsDataSizeLimit 1) @?= [],
          testProperty "Binary round-trip" $
            forAll genComputeBudgetInstruction $ \cbi -> decode (encode cbi) === cbi,
          testCase "decode fails on unknown discriminant" $
            case decodeOrFail (BL.pack [5]) :: Either (BL.ByteString, ByteOffset, String) (BL.ByteString, ByteOffset, CB.ComputeBudgetInstruction) of
              Left _ -> pure ()
              Right _ -> assertFailure "expected decode failure for discriminant 5"
        ]