{-# LANGUAGE BangPatterns #-} {-# LANGUAGE MagicHash #-} {-# LANGUAGE UnboxedTuples #-} module Wide ( tests ) where import qualified Data.Word.Wide as W import Test.Tasty import qualified Test.Tasty.HUnit as H overflowing_add_no_carry :: H.Assertion overflowing_add_no_carry = do let !(r, c) = W.add_o 1 0 H.assertBool mempty (W.eq_vartime r 1) H.assertBool mempty (c == 0) overflowing_add_with_carry :: H.Assertion overflowing_add_with_carry = do let !(r, c) = W.add_o (2 ^ (128 :: Word) - 1) 1 H.assertBool mempty (W.eq_vartime r 0) H.assertBool mempty (c == 1) wrapping_add_no_carry :: H.Assertion wrapping_add_no_carry = do let !r = W.add 0 1 H.assertBool mempty (W.eq_vartime r 1) wrapping_add_with_carry :: H.Assertion wrapping_add_with_carry = do let !r = W.add (2 ^ (128 :: Word) - 1) 1 H.assertBool mempty (W.eq_vartime r 0) tests :: TestTree tests = testGroup "wide tests" [ H.testCase "overflowing add, no carry" overflowing_add_no_carry , H.testCase "overflowing add, carry" overflowing_add_with_carry , H.testCase "wrapping add, no carry" wrapping_add_no_carry , H.testCase "wrapping add, carry" wrapping_add_with_carry ]