packages feed

integer-types-0.1.4.0: test/Spec/Multiplication.hs

module Spec.Multiplication where

import Essentials
import Integer (Positive, Signed)
import Integer.Gen (GenIntegral)
import Integer.Gen qualified as Gen
import Test.Hspec (Spec, context, it)
import Test.Hspec.Hedgehog
  ( PropertyT,
    forAll,
    hedgehog,
    modifyMaxSuccess,
    (===),
  )
import Prelude (fromInteger, toInteger, (*))

spec :: Spec
spec =
  context "(*) behaves the same in A as in Integer" do
    modifyMaxSuccess (\_ -> 1000) do
      it "A = Positive" $ hedgehog $ check @Positive
      it "A = Signed" $ hedgehog $ check @Signed

check ::
  forall a m.
  GenIntegral a =>
  Monad m =>
  PropertyT m ()
check = do
  x :: a <- forAll Gen.integral
  y :: a <- forAll Gen.integral
  x * y === fromInteger (toInteger x * toInteger y)