packages feed

clash-vexriscv-0.1: tests/unittests/Tests/VexRiscv/Random.hs

-- SPDX-FileCopyrightText: 2024 Google LLC
--
-- SPDX-License-Identifier: Apache-2.0
module Tests.VexRiscv.Random where

import Clash.Hedgehog.Sized.BitVector
import Clash.Prelude
import Hedgehog
import Test.Tasty
import Test.Tasty.Hedgehog

import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range

import VexRiscv.Random

tests :: TestTree
tests =
  testGroup
    "VexRiscv.Random"
    [ testProperty "genNatural" prop_genNatural
    , testProperty "makeDefinedRandomBitVector" prop_makeDefinedRandomBitVector
    , testProperty "makeDefinedRandomBit" prop_makeDefinedRandomBit
    ]

prop_genNatural :: Property
prop_genNatural = property $ do
  lo <- forAll $ Gen.integral (Range.linear 0 (shiftL 1 1024))
  hi <- forAll $ Gen.integral (Range.linear lo (shiftL 1 1024))
  n <- evalIO $ genNatural (lo, hi)
  assert ((n >= lo) && (n <= hi))

prop_makeDefinedRandomBitVector :: Property
prop_makeDefinedRandomBitVector = property $ do
  someBv <- forAll $ (genSomeBitVector @0) (Range.linear 0 1024) genBitVector
  case someBv of
    SomeBitVector SNat bv -> do
      definedBv <- evalIO $ makeDefinedRandom bv
      assert (not $ hasUndefined definedBv)
      assert (definedBv <= maxBound)

prop_makeDefinedRandomBit :: Property
prop_makeDefinedRandomBit = property $ do
  b <- forAll $ genBit
  definedB <- evalIO $ makeDefinedRandom b
  assert (not $ hasUndefined definedB)