packages feed

Crypto-4.2.5.2: src-test/WordListTest.hs

{-# LANGUAGE FlexibleInstances   #-}
{-# LANGUAGE TypeSynonymInstances   #-}

module Main(main) where

import           Codec.Utils     (listFromOctets, listToOctets)
import           Control.Monad   (unless)
import           Data.Bits       (Bits, bitSize)
import           Data.LargeWord  (Word128, Word160, Word192, Word224, Word256, Word96)
import           Data.Word       (Word32, Word64, Word8)
import           Test.QuickCheck

newtype WordsX a = WordsX [a]

instance Show a => Show (WordsX a) where
  show (WordsX x) = show x

instance (Bounded a, Integral a, Bits a) => Arbitrary (WordsX a) where
  arbitrary = fmap WordsX (liftArbitrary $ chooseBoundedIntegral (minBound,maxBound))

checks :: [(String, IO Result)]
checks =
    [ ("Word32", quickCheckWithResult args $
         \w          -> not (hasTrailingZero w) ==> (listFromOctets . listToOctets) w === (w :: [Word32]))
    , ("Word64", quickCheckWithResult args $
         \w          -> not (hasTrailingZero w) ==> (listFromOctets . listToOctets) w === (w :: [Word64]))
    , ("Word96", quickCheckWithResult args $
         \(WordsX w) -> not (hasTrailingZero w) ==> (listFromOctets . listToOctets) w === (w :: [Word96]))
    , ("Word128", quickCheckWithResult args $
         \(WordsX w) -> not (hasTrailingZero w) ==> (listFromOctets . listToOctets) w === (w :: [Word128]))
    , ("Word160", quickCheckWithResult args $
         \(WordsX w) -> not (hasTrailingZero w) ==> (listFromOctets . listToOctets) w === (w :: [Word160]))
    , ("Word192", quickCheckWithResult args $
         \(WordsX w) -> not (hasTrailingZero w) ==> (listFromOctets . listToOctets) w === (w :: [Word192]))
    , ("Word224", quickCheckWithResult args $
         \(WordsX w) -> not (hasTrailingZero w) ==> (listFromOctets . listToOctets) w === (w :: [Word224]))
    , ("Word256", quickCheckWithResult args $
         \(WordsX w) -> not (hasTrailingZero w) ==> (listFromOctets . listToOctets) w === (w :: [Word256]))
    ]
  where
    args = stdArgs { maxSuccess = 1000 }

    -- (listFromOctets . listToOctets) isn't a proper identity due to 'trimNulls'
    hasTrailingZero :: (Eq x, Num x) => [x] -> Bool
    hasTrailingZero [] = False
    hasTrailingZero xs = last xs == 0

main :: IO ()
main = do
   results <- mapM test checks

   unless (all isSuccess results) $
     fail "SOME TESTS FAILED!"

   putStrLn "=> all tests passed!"
 where
   test :: (String, IO a) -> IO a
   test (s, t) = do putStrLn $ "Checking " ++ s
                    putStr "        "
                    t