packages feed

pgp-wordlist-0.1.0.2: test/Main.hs

{-# LANGUAGE NumDecimals #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ParallelListComp  #-}

module Main where



import           Control.DeepSeq
import qualified Data.ByteString.Lazy                   as BSL
import           Test.Tasty
import qualified Test.Tasty.HUnit                       as HU
import qualified Test.Tasty.QuickCheck                  as QC
import           Text.Printf

import           Data.Text.PgpWordlist.Internal.Convert
import           Data.Text.PgpWordlist.Internal.Types



main :: IO ()
main = defaultMain tree



tree :: TestTree
tree = testGroup "Tests"
    [ allBytesConvertible
    , examplesBackAndForth
    , randomRoundtrips
    ]



allBytesConvertible :: TestTree
allBytesConvertible = HU.testCase description test
  where
    description = "All bytes have a corresponding even/odd word"
    assertNoBottoms x = x `deepseq` HU.assertBool "" True
    test = assertNoBottoms (do
        byte <- [minBound ..]
        convert <- [unEvenWord . toEvenWord, unOddWord . toOddWord]
        return $! convert byte )



examplesBackAndForth :: TestTree
examplesBackAndForth = testGroup "Explicit example conversions" tests
  where
    tests = concat
        [ [ HU.testCase (printf "#%d: Bytes to PGP words" i)
                        (HU.assertEqual "" (toText bytes) pgpWords)
          , HU.testCase (printf "#%d: PGP words to bytes" i)
                        (HU.assertEqual "" (Right bytes) (fromText pgpWords))
          ]
        | (bytes, pgpWords) <- testCases
        | i <- [0..] :: [Int]
        ]

    first f (a,b) = (f a, b) -- Bifunctor came into Base in 7.10 only

    testCases = map (first BSL.pack)
        [ ( [ 0xce, 0xe7, 0x1c, 0xbf, 0xe6, 0x59, 0x49, 0x48
            , 0x06, 0x7a, 0xd2, 0xfc, 0xb7, 0x74, 0x48, 0x18 ]
          , "spyglass truncated befriend rebellion tracker examine deckhand \
            \dictator afflict infancy standard wilmington seabird hydraulic \
            \deadbolt borderline"
          )
        , ( [ 0xb3, 0xc6, 0x75, 0x64, 0xa7, 0x9e, 0x0a, 0xbb
            , 0x84, 0x98, 0xd3, 0x33, 0xf1, 0xe4, 0x2a, 0x92 ]
          , "scallion responsive indulge getaway repay onlooker allow \
            \publisher mural narrative stapler concurrent unwind tradition \
            \brickyard misnomer"
          )
        , ( [ 0xb2, 0x8d, 0x47, 0xf8, 0x8c, 0x57, 0xb5, 0x09
            , 0x2e, 0x26, 0xf1, 0x24, 0x65, 0xb9, 0xae, 0xd7 ]
          , "sawdust microscope dashboard warranty offload eskimo scorecard \
            \applicant buzzard caretaker unwind capricorn fracture proximate \
            \robust stethoscope"
          )
        , ( [ 0x72, 0x19, 0x07, 0xf2, 0xca, 0x6f, 0xe4, 0xee
            , 0x52, 0x8f, 0x47, 0x3a, 0xbd, 0xf3, 0x64, 0x5b ]
          , "highchair bottomless ahead vagabond spellbind hemisphere tonic \
            \universe dupont midsummer dashboard corrosion skullcap vertigo \
            \flytrap exodus"
          )
        , ( [ 0xe9, 0x75, 0x73, 0x8c, 0x03, 0xc1, 0x49, 0x7f
            , 0xfd, 0xce, 0xd3, 0x8f, 0xfa, 0x3d, 0xd8, 0xf2 ]
          , "treadmill impartial hockey megaton acme recover deckhand \
            \integrate willow sardonic stapler midsummer wallet crucifix \
            \stormy vagabond"
          )
        , ( [ 0x2d, 0x56, 0x8c, 0x11, 0x95, 0x47, 0x4f, 0x6f
            , 0xe4, 0x05, 0x46, 0xfe, 0xc9, 0xf4, 0x41, 0x9a ]
          , "button escapade offload babylon preclude determine dropper \
            \hemisphere tonic almighty cubic yesteryear spearhead virginia \
            \cranky newsletter"
          )
        , ( [ 0xb2, 0x68, 0xfc, 0xe4, 0x2c, 0xf5, 0xe5, 0x04
            , 0xb4, 0xfb, 0xec, 0xe3, 0xc8, 0xe4, 0x29, 0xa5 ]
          , "sawdust gravity wayside tradition burbank visitor topmost alkali \
            \scenic wichita tumor torpedo spaniel tradition breakup paperweight"
          )
        , ( [ 0xbb, 0x96, 0x68, 0xc6, 0x33, 0x11, 0x4f, 0x7c
            , 0x51, 0x5e, 0x7f, 0xe3, 0x1b, 0xc0, 0x6f, 0xc7 ]
          , "shamrock monument frighten responsive chisel babylon dropper \
            \informant drunken finicky lockup torpedo beeswax recipe gremlin \
            \retraction"
          )
        ]

randomRoundtrips :: TestTree
randomRoundtrips = makeGroup tests
  where
    makeGroup = localOption (QC.QuickCheckMaxSize 1024)
              . localOption (QC.QuickCheckTests 1e3)
              . testGroup "Random roundtrips"
    tests = [ QC.testProperty "Bytes -> PGP words -> Bytes" $
                \bytes -> let bs = BSL.pack bytes
                          in  length bytes > 10
                              QC.==>
                              fromText (toText bs) == Right bs
            ]