{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE TypeFamilies #-} -- | -- Module : Test.BigNum.Num2 -- Copyright : [2017..2020] Trevor L. McDonell -- License : BSD3 -- -- Maintainer : Trevor L. McDonell -- Stability : experimental -- Portability : non-portable (GHC extensions) -- module Test.BigNum.Num2 ( test_num2 ) where import Test.Base import Test.Iso import Test.ShowType import Data.Array.Accelerate.Data.BigInt import Data.Array.Accelerate ( Elt, Exp, Plain, Lift ) import qualified Data.Array.Accelerate as A import Data.Bits import Hedgehog import Test.Tasty import Test.Tasty.Hedgehog test_num2 :: RunN -> TestTree test_num2 runN = testGroup "Num2" [ testElt w8 , testElt w16 , testElt w32 , testElt w64 , testElt i8 , testElt i16 , testElt i32 , testElt i64 ] where testElt :: ( Show e, Num2 e, Integral e, Show e, Show (ArgType e), FiniteBits (Unsigned e), Integral (Unsigned e) , Num2 (Exp e), Elt e, Elt (Unsigned e), Lift Exp (Unsigned (Exp e)), Plain (Unsigned (Exp e)) ~ Unsigned e ) => Gen e -> TestTree testElt e = testGroup (showType e) [ testProperty "addWithCarry" $ prop_addWithCarry e , testProperty "mulWithCarry" $ prop_mulWithCarry e -- , testProperty "addWithCarry" $ prop_acc_addWithCarry runN e , testProperty "mulWithCarry" $ prop_acc_mulWithCarry runN e ] prop_addWithCarry :: (Show e, Num2 e, Integral e, Show e, FiniteBits (Unsigned e), Integral (Unsigned e)) => Gen e -> Property prop_addWithCarry e = property $ do x <- forAll e y <- forAll e uncurry toInteger2 (addWithCarry x y) === toInteger x + toInteger y prop_mulWithCarry :: (Show e, Num2 e, Integral e, Show e, FiniteBits (Unsigned e), Integral (Unsigned e)) => Gen e -> Property prop_mulWithCarry e = property $ do x <- forAll e y <- forAll e uncurry toInteger2 (mulWithCarry x y) === toInteger x * toInteger y prop_acc_addWithCarry :: ( Show e, Num2 (Exp e), Integral e, FiniteBits (Unsigned e), Integral (Unsigned e) , Elt e, Elt (Unsigned e), Lift Exp (Unsigned (Exp e)), Plain (Unsigned (Exp e)) ~ Unsigned e ) => RunN -> Gen e -> Property prop_acc_addWithCarry runN e = property $ do x <- forAll e y <- forAll e uncurry toInteger2 (with_acc_binary runN (A.lift $$ addWithCarry) x y) === toInteger x + toInteger y prop_acc_mulWithCarry :: ( Show e, Num2 (Exp e), Integral e, FiniteBits (Unsigned e), Integral (Unsigned e) , Elt e, Elt (Unsigned e), Lift Exp (Unsigned (Exp e)), Plain (Unsigned (Exp e)) ~ Unsigned e ) => RunN -> Gen e -> Property prop_acc_mulWithCarry runN e = property $ do x <- forAll e y <- forAll e uncurry toInteger2 (with_acc_binary runN (A.lift $$ mulWithCarry) x y) === toInteger x * toInteger y